从这个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.
总的来说,我注意到只要使用.*
或.+
:
如果有,只有一个匹配。
字符串的匹配部分始终是最长的部分。
那么每个人的匹配工作如何?
答案 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