两者似乎都意味着,匹配0个或更多字符?我不明白它们之间的区别,或何时使用?
以及何时使用*
。一些例子会有所帮助。
答案 0 :(得分:8)
?
表示零或一个。 *
表示任意数量的。所以这个:
^ab?$
会匹配a
和ab
,但不匹配abb
。这样:
^ab*$
不仅会与a
和ab
匹配,还会与abb
,abbb
和a
匹配,其中包含b
个它
答案 1 :(得分:6)
在形式定义中,正则表达式运算符的符号为
.
:像a.b.c这样的连接符合具有abc的文本。有时候表示连接只是两个符号背靠背使用。
*
:匹配最后一个符号0次或更多次,(abc)*将匹配空字符串,abc,abcabc,abcabcabc,但不匹配abcaabc。被称为Kleen的明星。
+
:匹配左侧或右侧。 (abc + def)将匹配abc或def。还使用了union运算符或|
运算符。
这些符号应用于一组符号 sigma ,其中包含您所用语言中的符号,其他特殊符号是 epsilon ,表示空字符串,< em> null 表示根本没有符号。有关详细信息,请参阅[3]
这些是正式定义。
当您使用接受POSIX正则表达式语法的应用程序时,不同运算符的含义如下:
这些是 POSIX Basic正则表达式操作
.
:点'。'匹配像a.c这样的任何字符都可以匹配abc,axc,amc,aoc any。
^
:表示行的开头。 ^abc
将匹配从该行开始的字符串。出现在行之间的abc将不匹配
$
:表示行尾。 abc$
只匹配行尾的字符串abc。这与行之间的任何'abc'都不匹配。
*
:匹配'*'之前的最后一个符号0或更多次。所以ab*c
将匹配ac,abc,abbc,abbbc,abbbbbc,abbbbbbbbc等。
{m, n}
:匹配前面的符号atleat'm'次,最多匹配'n'次。
ab{2,4}c
不匹配'abc',但匹配'abbc','abbbc','abbbbc',但不匹配'abbbbbc'。因此,如果'b'的数量>&gt; = 2且&lt; = 4则匹配。
{m,}
:表示匹配前面的符号最小'm'次,并且最大值没有限制。 (注意逗号)
{n}
:表示完全匹配前一个符号'n'次。所以ab{3}c
只匹配'abbbc'。
[symbols]
:将匹配方括号内的任何一个符号。像a[xyz]c
匹配'axc','ayc'和'azc'而没有其他字符串
[^symbols]
:将匹配框括号内不的任何符号。像a[xyz]c
一样,任何字符串'a.b'都匹配'。'是除了 x,y,z之外的任何符号。
这些是 POSIX扩展正则表达式运算符(需要grep -E
)
?
:将匹配前面的符号0或最多1次。所以ab?c
只匹配'ac'和'abc'。
+
:将匹配前面的符号至少1次,最多任意次数(无上限)。像ab+c
匹配abc,abbbc,abbbbbc,abbbbbbbbc等,但不匹配'ac'
|
:匹配“|”左侧的表达式或“|”右侧的右侧表达。比如(ab+c)|(xy*z)
。
另请查看 POSIX元字符类[:alpha:]
代表所有字母表。 [:punct:]
表示所有标点符号等。
Wild Characters / Globs
如果您使用*
和?
作为外卡,则解释如下
*
:匹配此位置的任意数量的任何字符。像*.c
一样意味着所有以字符串'.c'结尾的字符串(这里没有特殊的解释)。使用ls *.c
或ls *.doc
?
:在此位置只匹配任何一个字符。像file??.txt
匹配字符串'fileab.c','file00.c'等,并匹配任何正好两个字符。使用ls *.???
进行测试,列出所有具有三个字符扩展名的文件。
我希望这能回答你的问题。或者您可能希望通过一些关于正式定义和POSIX的文本以及Perl样式的正则表达式来获得清晰的想法。
参考文献: Wikipedia Page
grep manual Regular expression section
Theory of Computation by Michael Sipser
注意: 此答案已重建
答案 2 :(得分:4)
为了正则表达式的完整性,还使用*?
之类的东西。在这种情况下,它是一个懒惰匹配或非贪婪匹配,在匹配下一个标记之前将匹配尽可能少的字符。
例如:
a.*a
将匹配整个abaaba
,而
a.*?a
将匹配aba
,aba