1

从本教程中,我了解了“正则表达式 - 量词”,并基于本教程中使用的测试代码。

我对这些测试有疑问:

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.

一般来说,我注意到无论何时.*.+使用:

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

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

那么 Matching 是如何为每一个工作的呢?

4

6 回答 6

3

ab*foo将匹配 an a,后跟 0 个或多个bs,然后是foo

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

b+将匹配该字符的 1 个或多个实例b

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

于 2013-01-07T22:37:39.233 回答
2

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

您只需在量词之后添加即可使其成为非贪婪?的,这将告诉正则表达式尽可能少地匹配,以便匹配您想要的。

毕竟:

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

于 2013-01-07T22:40:01.790 回答
1

*贪婪地匹配前一个字符的零个或多个。 .匹配任何字符。所以.*意味着“匹配零个或多个任何字符”。

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

于 2013-01-07T22:36:57.333 回答
0

ab*foo

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

afoo
abfoo
abbfoo
abbbfoo
abbbbbbbbbbbbbbbbbbbbfoo

a.*foo

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

afoo
abfoo
acfoo
adfoo
asdfoo
asdasdfasdfawqfefoo
于 2013-01-07T22:48:02.710 回答
0

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

不过,有些可能可以通过选项进行配置。

于 2013-01-07T22:40:58.260 回答
0

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

于 2013-01-07T22:36:52.540 回答