替代消极的外观?

时间:2017-06-07 05:25:29

标签: regex

我特意使用Ruby,但我很好奇...说我试图匹配小数后跟至少三位数。

这里是正则表达式:/(\.\d{5,})/

如果不使用负面的lookbehind,如果它遵循A)空格或制表符或换行符,或者B)是字符串的开头,我将如何才能使它成为唯一匹配?

1 个答案:

答案 0 :(得分:1)

让我们首先考虑如何使用lookbehind来完成它。 然后我们只检查在捕获之前是否是行的开头或空格:

(?<=^|\s)(\.\d{5,})

我们可以简单地将该看法改为普通的捕获组 这意味着前面的空格也会被捕获。但是在替换中,如果我们想保留它,我们就可以使用该捕获。

(^|\s)(\.\d{5,})

在PCRE正则表达式引擎中我们有\ K

  

\ K:重置报告的匹配的起点。任何先前的   消费的字符不再包含在最终匹配中

因此,通过在正则表达式中使用\ K,前面的空格不包含在匹配

(?:^|\s)\K(\.\d{5,})

测试here

但是,如果将scan与具有捕获组的正则表达式一起使用?然后它似乎只输出捕获组,而不是非捕获组或捕获组中没有的东西 例如:

m = '.12345 .123456 NOT.1234567'.scan(/(?:^|\s)(\.\d{5,})/)
=> [[".12345"], [".123456"]]

m = 'ab123cd'.scan(/[a-z]+(\d+)(?:[a-z]+)/)
=> [["123"]]

因此,当您使用扫描时,不需要使用外观。