gpt4 book ai didi

ruby - 为什么不匹配交替中更长的标记?

转载 作者:数据小太阳 更新时间:2023-10-29 07:10:04 25 4
gpt4 key购买 nike

我正在使用 ruby​​ 2.1,但可以在 rubular 网站上复制同样的东西。

如果这是我的字符串:

儘管中國婦幼衛生監測辦公室制定的

然后我用这个表达式进行正则表达式匹配:

(中國婦幼衛生監測辦公室制定|管中)

我希望得到更长的 token 作为匹配项。

中國婦幼衛生監測辦公室制定

相反,我将第二个交替作为匹配项。

据我所知,当不是汉字时,它确实是这样工作的。

如果这是我的字符串:

foobar

我使用这个正则表达式:

(foobar|foo)

返回的匹配结果为foobar。如果顺序是相反的,则匹配字符串是 foo。这对我来说很有意义。

最佳答案

您假设正则表达式匹配更长的交替是不正确的。

如果您有一点时间,让我们看看您的正则表达式是如何工作的...

快速复习:正则表达式的工作原理:状态机始终从左到右读取,必要时回溯。

有两个指针,一个在Pattern上:

(cdefghijkl|bcd)

你的字符串上的另一个:

abcdefghijklmnopqrstuvw

String 上的指针从左边移动。一旦它可以返回,它:

x
(来源:gyazo.com)

让我们把它变成一个更“连续”的顺序来理解:

y
(来源:gyazo.com)

您的 foobar 示例是一个不同的主题。正如我提到的 in this post :

How regex works: The state machine always reads from left to right. ,|,, == ,, as it always will only be matched to the first alternation.

这很好,Unihedron,但我如何强制它进行第一个交替?

看!*

^(?:.*?\Kcdefghijkl|.*?\Kbcd)

这里有一个 regex demo .

此正则表达式首先尝试将整个字符串与第一个交替匹配。只有当它完全失败时,它才会尝试匹配第二个交替。 \K 在这里用于保持构造\K 的内容的匹配。


*:自 2.0.0 起,Ruby 支持 \K

阅读更多:





啊,我很无聊,所以我优化了正则表达式:

^(?:(?:(?!cdefghijkl)c?[^c]*)++\Kcdefghijkl|(?:(?!bcd)b?[^b]*)++\Kbcd)

你可以看到一个演示here .

关于ruby - 为什么不匹配交替中更长的标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25511528/

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