正则表达式(ab * foo)vs(a。* foo)的区别?

时间:2013-01-07 22:35:05

标签: regex

从这个tutorial我学到了“正则表达式 - 量词”,并基于本教程中使用的test code

我对这些测试有疑问:

Enter your regex: ab*foo
Enter input string to search: xabfooxxxabbbfoox
I found the text "abfoo" starting at index 1 and ending at index 6.
I found the text "abbbfoo" starting at index 9 and ending at index 16.

但是

Enter your regex: a.*foo
Enter input string to search: xabfooxxxabbbfoox
I found the text "abfooxxxabbbfoo" starting at index 1 and ending at index 16.

为什么不是这些:

I found the text "abfoo" starting at index 1 and ending at index 6.
I found the text "abbbfoo" starting at index 9 and ending at index 16.

总的来说,我注意到只要使用.*.+

  • 如果有,只有一个匹配。

  • 字符串的匹配部分始终是最长的部分。

那么每个人的匹配工作如何?

6 个答案:

答案 0 :(得分:3)

ab*foo将匹配a,后跟0或更多b s,然后是foo

a.*foo将匹配a,后跟0个或更多任何字符(由.表示),然后是foo

b+会匹配字符b

的一个或多个实例

查看regex101以获得一个很好的正则表达式测试工具,它将解释您的模式意味着什么

答案 1 :(得分:2)

你遇到的问题是,在第二个正则表达式中,*是一个贪婪的量词。那是什么意思?这意味着它不会在该foo字符串的最后一次出现之前停止。

你可以通过在量词之后添加?来使它变得非贪婪,这将告诉正则表达式尽可能少地匹配,以便它匹配你想要的。

毕竟:

您的第一个匹配尽可能多b,甚至为0 你的第二个将匹配尽可能多的.(无论是什么字符),甚至是0。

答案 2 :(得分:1)

*贪婪地匹配前一个字符的零个或多个。 .匹配任何字符。因此.*表示“匹配任何字符的零或更多”。

关键是“贪婪”的一部分。 a.*foo将继续一直搜索字符串的末尾,查找foo的最后一次出现,一旦找到它,它就会“备份”并标记匹配完成。所以,如果你有axxxxfooxxxfooxxx,那么贪婪的匹配行为将匹配中间的foo,将其视为任何其他字符,但会在最后一个字符处停止。

答案 3 :(得分:0)

acfoo匹配a.*foo但不匹配ab.*foo,例如。

答案 4 :(得分:0)

。*或。+生成一个匹配项(如果有),因为默认情况下,大多数正则表达式程序设置为匹配可能的最长子字符串。

但有些可能是通过选项配置的。

答案 5 :(得分:0)

ab*foo

将匹配a后跟0或更多b和foo 例如:

afoo
abfoo
abbfoo
abbbfoo
abbbbbbbbbbbbbbbbbbbbfoo

a.*foo

将匹配a后跟foo后面的任何内容

afoo
abfoo
acfoo
adfoo
asdfoo
asdasdfasdfawqfefoo