我使用 Perl 已有十年了。但最近我对使用 .* 感到困惑?正则表达式。
它似乎与最小字符数不匹配。有时它会给出不同的结果。
例如,对于此字符串:aaaaaaaaaaaaaaaaaaaaaaammmmmmmmmmmbaaaaaaaaaaaaaaaaaaaaab 和模式:a.*?b 它匹配两组中的完整输入字符串。根据定义,它应该与最后一个“ab”匹配。
它不会导致a.*?b
匹配尽可能少的字符;它导致.*
匹配尽可能少的字符。因为它只影响.*
,它对已经匹配的内容没有影响(即通过a
).
示例缩短为:
#01234
'aaab' =~ /a.*?b/
会发生什么:
- 在位置 0 处,
a
匹配 1 个字符 (a
).
- 在位置 1 处,
.*?
匹配 0 个字符(空字符串)。
- 在位置 1 处,
b
无法匹配。 ⇒ 原路返回
- 在位置 1 处,
.*?
匹配 1 个字符 (a
).
- 在位置 2 处,
b
无法匹配。 ⇒ 原路返回
- 在位置 1 处,
.*?
匹配 2 个字符 (aa
).
- 在位置 3 处,
b
匹配 1 个字符 (b
)
- 模式匹配成功。
正如您所看到的,它尝试匹配零个字符,这显然是最小的可能匹配。但整体模式在这样做时未能匹配,因此尝试越来越大的匹配,直到整体模式匹配为止。
我尽量避免使用非贪婪修饰符。
'aaab' =~ /a[^ab]*b/
If a
确实是更复杂的东西,那么我们可以使用负前瞻。
'aaab' =~ /a(?:(?!a|b).)*b/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)