我设置了一个复杂的正则表达式,从文本页面中提取数据。但是出现了一些问题,备选项的顺序不符合我的预期。一个简单的例子如下:
((13th|(Executive |Residential)|((\w+) ){1,3})Floor)
简单来说,我想要获取楼层数、已知的具名楼层,或者在后备情况下获取跟着1-3个未知单词的“floor”,以便稍后查看(实际上我使用一个组名来标识这个,但是我不想让事情变得混乱)。
问题在于如果字符串是:
on the 13th Floor
我不理解13楼
,但我理解的是在第13层楼
,这似乎表明它匹配了第三个选择。我本来期望它能匹配到13楼。我特意设置了这个规则(或者我以为是这样),以便优先匹配某些类型,只有当其他匹配失败时才留下模糊的匹配。我想他们说正则表达式很贪婪,这一点并不是开玩笑,但我不清楚如何设置它才能变得“贪婪”,并按照我想要的方式运行。
\w+
(或{1,3}
)量词的贪婪性并不是问题所在。问题在于NFA正则表达式引擎匹配“最长最左侧”子字符串。只要在“floor”之前有三个单词,无论任何量词的贪婪/懒惰程度,其他两个选项都永远没有机会进行匹配。 - ridgerunner\w+
总是匹配最长的最左边的子字符串! - zmo\w+
贪婪地匹配一个单词。在这种情况下,如果变成懒惰模式对整体匹配没有影响。同样适用于{1,3}
量词。正则表达式引擎必须尝试所有可能性才能放弃,即使所有量词都是懒惰的,在其他备选项之前,最后一个备选项始终能够匹配。 - ridgerunner