Kel*_*sey 4 regex regex-greedy
我有一个非常基本的正则表达式,我无法弄清楚为什么它不起作用所以问题是两部分.为什么我当前的版本不起作用,什么是正确的表达式.
规则很简单:
因此,以下案例应解决如下:
我正在使用的表达式是:
^%?\S{3}
Run Code Online (Sandbox Code Playgroud)
对我来说意味着:
^ - 字符串开头%? - 贪婪检查0或1%字符\S{3} - 其他3个不是空格的字符问题是,由于%?某种原因,没有进行贪婪的检查.如果它存在的话,它不会占用%字符,所以'%AB'的情况正在传递,我认为应该失败.为什么%?不吃%字符?
有人请告诉我光:)
编辑:我使用的答案是下面的Dav:^(%\S{3}|[^%\s]\S{2})
尽管这是一个2部分的答案,Alan真的让我理解为什么.我没有使用他的版本,^(?>%?)\S{3}因为它有效但不是在javascript实现中.两个伟大的答案和很多帮助.
如果可以的话,正则表达式将始终尝试匹配整个模式 - "贪婪"并不意味着"如果它存在,将永远抓住角色",而是意味着"如果角色存在并且可以与它抓住了 ".
相反,你可能想要的是这样的:
^(%\S{3}|[^%\s]\S{2})
Run Code Online (Sandbox Code Playgroud)
哪个匹配%后跟3个字符,或非%,非空白后跟2个.
你所描述的行为这个词并不贪婪,而是占有欲.普通的,贪婪的量词可以与原来的一样多,但如果有必要可以使整个正则表达式匹配(我喜欢将它们视为贪婪但容易接受).这就是你发生的事情:%?最初匹配前导的百分号,但是如果没有足够的字符用于整体匹配,它会放弃百分号并让我们\S{3}匹配它.
一些正则表达式风格(包括Java和PHP)支持占有量词,它们永远不会退缩,即使这会导致整体匹配失败..NET没有那些,但它有下一个最好的东西:原子组.无论你放在一个原子组中的什么行为就像一个单独的正则表达式 - 它要么在它应用的位置匹配,要么它不匹配,但它永远不会回来并尝试匹配比原来更多或更少的匹配因为其余的正则表达式失败(也就是说,正则表达式引擎永远不会回溯到原子组).以下是如何将它用于您的问题:
^(?>%?)\S{3}
Run Code Online (Sandbox Code Playgroud)
如果字符串以百分号开头,则(?>%?)匹配它,如果没有足够的字符\S{3}匹配,则正则表达式失败.
请注意,正如@Dav所示,原子组(或占有量词)不是解决这个问题所必需的.但它们是非常强大的工具,可以很容易地在不可能和可能之间做出区别,或者可能是太迟钝和光滑.
| 归档时间: |
|
| 查看次数: |
983 次 |
| 最近记录: |