我对正则表达式有疑问。
有两个命令。
find / -regex '.*[^-_./0-9a-zA-Z].*'
find /
如果我是对的,这两个命令应该输出相同的结果。因为,第一个命令有.*
最先出现的正则表达式。这意味着“找到任何字符,并且它可以出现零个或多个”。这意味着所有文件名。因为文件名可以由任何字符组成,包括空格(“”),并且不可能出现零字符(这意味着文件没有名称)。所以,毕竟,我认为他们输出相同的结果。
但是当我将这些命令与 一起使用时| wc -l
,这意味着“输出结果行”,结果是不同的。
我错过了什么吗?
答案1
下面是一个示例 -- .* 表示 0 个或多个任意字符。在第二种情况下,它匹配任何字符的 0,后跟非排除字符之一。
ls
1 a =a ++a a.0 a_1 B b0
find .
.
./B
./=a
./b0
./a_1
./a
./1
./a.0
./++a
find . -regex '.*[^-_./0-9a-zA-Z].*'
./=a
./++a
答案2
.*
后面跟着[^-_./0-9a-zA-Z]
- 并且它不是可选的。因此,除了这些字符之一(字母、数字、、、和)之外的其他字符-
应该_
在文件名中出现一次.
。/
任何仅由这些字符组成的路径都不会被打印。
因此这些命令不需要输出相同的结果。