我正在阅读有关“Glob”和“Globbing Pathnames”的内容,我发现这个奇怪的(对我来说)部分手册页:
“[--0]”匹配“-”、“.”、“0”这三个字符,因为“/”不能匹配。
我很困惑!两个破折号和一个0
匹配怎么办.
?角色在这里扮演什么角色/
?这是手册页中的错误吗?
答案1
正如该段落开头所解释的那个手册页, '-' 特点,当放在两个字符之间时, 代表一系列字符,还有“-”字符,当作为括号之间的第一个或最后一个字符放置时,有其字面意义。因此,第一个破折号实际上表示“-”字符,第二个破折号是范围说明符。因此,整个模式由“-”和“0”之间的所有字符组成,在 C/POSIX 语言环境中(但通常不在其他语言环境中)是:
-
.
/
0
和因为'/'无法匹配,该模式匹配三个字符“-”、“.”、“0”。
答案2
这与手册页本身无关:它是对 glob 模式语法的描述,您正在查看的手册页就是关于它的。
在 glob 模式中,括号分隔字符集。例如,[abc]
匹配任何字符a
,b
或c
。该模式fo[abc]
匹配foa
, fob
and foc
(但不匹配例如foo
, or fo
, or foab
)。
括号内的字符-
具有特殊含义:它用于形成字符范围。因此,该模式不是匹配0
, -
or ,而是匹配任何数字。范围可以与其他范围和单独的字符组合;例如在 ASCII 编码中匹配任何字母或下划线。9
[0-9]
[A-Za-z_]
仅当在语法上合理时,减号才被解释为范围指示符:如果它是括号内的第一个或最后一个字符,或者如果它紧接在另一个范围之后,则-
代表其自身。因此[--0]
,在 中,第一个-
代表自身,第二个-
是范围指示符,因此此模式匹配当前语言环境中-
和之间的任何字符。0
在里面ASCII码编码,该范围涵盖以下 4 个字符:-
, .
, /
, 0
。该字符/
不能出现在文件名中,因为它始终被解释为目录分隔符;因此该模式[--0]
仅匹配 3 个字符-
,.
和0
。
请注意,在 ASCII 以外的区域设置中,模式可以匹配不同的字符集。区域设置对字符范围的影响系统和应用程序之间存在一定的差异。
大多数正则表达式引擎对字符范围使用与 shell glob 模式相同的语法,但有两个区别:
- 在 glob 模式中,如果左括号后的第一个字符是 a
!
,则该模式匹配所有字符不是在集合中。在正则表达式中,字符^
起着相同的作用。一些 shell^
也支持!
. - 某些正则表达式变体允许
\
使下一个字符失去其特殊含义,例如[\[\]\-a]
匹配[
、]
或。在其他正则表达式变体和 glob 模式中,字符集中的反斜杠没有特殊含义。如果是在集合中,则它必须排在第一位(不可能指定空集合:是一个不完整的模式,匹配右括号或后面出现的任何字符)。-
a
]
[]