*和?之间的区别是什么?在正则表达式?

时间:2011-05-08 05:04:23

标签: regex

两者似乎都意味着,匹配0个或更多字符?我不明白它们之间的区别,或何时使用?以及何时使用*。一些例子会有所帮助。

3 个答案:

答案 0 :(得分:8)

?表示零或一个。 *表示任意数量的。所以这个:

^ab?$

会匹配aab,但不匹配abb。这样:

^ab*$

不仅会与aab匹配,还会与abbabbba匹配,其中包含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 *.cls *.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

将匹配abaaba

相关问题