我想知道在正则表达式字符串中使用*
和之间有什么区别。.*
我猜,*
代表“0到n个字符”,但我不明白.*
代表什么。
例如,:"2013*11*27"
和之间有什么区别"2013.*11.*27"
?如果我看一下
find . -name [pattern]
作为我尝试过的模式:"2013.*11.*25"
并且它没有找到"2013-11-25"
,但是,使用"2013*11*25"
,它找到了它。
为什么 ?在unix中,0或n次出现的通配符是:*
,在正则表达式中.*
那么为什么它不起作用呢?
答案1
*
代表0个或多个任意字符在外壳通配符火柴。
*
代表0 次或多次出现前面的表达式 在正则表达式火柴。
.
代表单个任意字符在正则表达式火柴。
因此,*
在 shell 中通配符匹配相当于.*
在正则表达式中匹配。
“2013*11*27”中正则表达式匹配将匹配"2013333111111111127"
但不匹配"2013-11-27"
,但如果您使用它来查找文件,例如作为 的参数ls
,让 shell 将其处理为“shell 通配符匹配”(而不是正则表达式),它将"2013-11-27"
很好地捕获。
* (在您的情况下,表达式是与该字符完全匹配的单个字符,3
并且1
分别。)
答案2
首先,您需要将 regexp 与 unix shell 模式分开。
在 ksh 命令中需要特殊选项,您将使用 unix 模式。
例如,如果您使用 grep -R,您将使用正则表达式。
正则表达式中的Syntax*
表示出现 0 次或 n 次。在unix
模式*
中,意味着任何字符串,并且取决于带或不带跳行的设置。
如果使用正则表达式,.*
则表示除跳转行 0 或 n 次之外的任何字符,并且在正则表达式中
使用将匹配前一个字符 0 或 n 次。*
.*
在正则表达式中相当于unix pattenr*
find -name
使用unix模式,因此.*
在模式中使用表示找不到.ANY_STRING_OR_NO_STRING
任何环。
你使用正则表达式使用
find -regex
看待