gpt4 book ai didi

正则表达式交替顺序

转载 作者:行者123 更新时间:2023-12-04 18:07:28 26 4
gpt4 key购买 nike

我设置了一个复杂的正则表达式来从一页文本中提取数据。出于某种原因,交替的顺序不是我所期望的。一个简单的例子是:

((13th|(Executive |Residential)|((\w+) ){1,3})Floor)

简而言之,我试图获得一个楼层号,一个已知的命名楼层,作为备份,我捕获 1-3 个未知单词,然后是 floor 以备以后查看(实际上我使用组名来识别这个但不想混淆问题)

问题是如果字符串是
on the 13th Floor

我不明白 13th Floor我收到 on the 13th Floor这似乎表明它与第三个交替匹配。我原以为它会匹配 13 楼。我专门设置了这个(或者我认为)以优先考虑匹配的类型,并且只有在错过其他匹配时才将模糊的保留在最后。我猜当他们说 Regex 是贪婪的时,他们不是在开玩笑,但我不清楚如何将其设置为“贪婪”并按照我想要的方式行事。

最佳答案

嗯,一个自动机值 1000 字:

Regular expression visualization

play with it

您的问题是您使用的是贪婪的 \w+您的交替中的子正则表达式。因为正如@rigderunner 在他的评论中所说的那样,NFA 匹配最长的最左边的子字符串 \w+将始终匹配 Floor 之前的任何内容,无论是一串字,还是13thExecutiveResidential或者他们三个。括号不会改变交替的行为方式。

因此,它匹配而您不希望它匹配的最坏情况是:

xxxx yyyy zzz tttt Floor

您的正则表达式的问题在于您希望做一些实际正则表达式无法做到的事情:如果替代方案不起作用,您希望它匹配单词。由于常规语言无法跟踪状态,因此常规正则表达式无法表达这一点。

我实际上不确定使用某种前瞻性是否可以帮助您在一个正则表达式中做到这一点,即使可以,您最终也会得到一个非常复杂、不可读甚至可能效率不高的正则表达式。

因此,您可能更喜欢使用两个正则表达式,并从第二个正则表达式中获取组,以防第一个失败:
((13th|Executive|Residential) +Floor)

如果没有匹配
((\w+ +){1:3}Floor)

注意:为避免重复我自己,请查看 that other answer在那里我列出了有关正则表达式和 NFA 的有趣资源的列表。这将帮助您了解正则表达式的实际工作方式。

关于正则表达式交替顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23783053/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com