gpt4 book ai didi

regex - R: (*SKIP)(*FAIL) 多个模式

转载 作者:行者123 更新时间:2023-12-04 22:20:07 27 4
gpt4 key购买 nike

给定 test <- c('met','meet','eel','elm') ,我需要一行代码来匹配不在“me”或“ee”中的任何“e”。我写了 (ee|me)(*SKIP)(*F)|e , 它不排除 'met' 和 'eel',但不排除 'meet'。这是因为|是独家还是?无论如何,有没有只返回“elm”的解决方案?
作为记录,我知道我也可以做 (?<![me])e(?!e) ,但我想知道 (*SKIP)(*F) 的解决方案是什么以及为什么我的线路是错误的。

最佳答案

这是 (*SKIP)(*F) 的正确解决方案:

(?:me+|ee+)(*SKIP)(*FAIL)|e

Demo on regex101 ,使用以下测试用例:
met
meet
eel
elm
degree
zookeeper
meee

只有 eelm , 第一 edegree最后 ezookeeper匹配。

eee被禁止,任何 e在之后 m被禁止,任何 e在连续 e 的子串中是禁止的。这解释了子模式 (?:me+|ee+) .

虽然我知道这种方法不可扩展,但至少在逻辑上是正确的。

其他解决方案分析

解决方案 0
(ee|me)(*SKIP)(*F)|e

让我们使用 meet举个例子:
meet        # (ee|me)(*SKIP)(*F)|e
^ # ^

meet # (ee|me)(*SKIP)(*F)|e
^ # ^

meet # (ee|me)(*SKIP)(*F)|e
^ # ^
# Forbid backtracking to pattern to the left
# Set index of bump along advance to current position

meet # (ee|me)(*SKIP)(*F)|e
^ # ^
# Pattern failed. No choice left. Bump along.
# Note that backtracking to before (*SKIP) is forbidden,
# so e in second branch is not tried

meet # (ee|me)(*SKIP)(*F)|e
^ # ^
# Can't match ee or me. Try the other branch

meet # (ee|me)(*SKIP)(*F)|e
^ # ^
# Found a match `e`

问题是由于 me消耗第一个 e , 所以 ee匹配失败,留下第二个 e可供匹配。

解决方案1
\w*(ee|me)\w*(*SKIP)(*FAIL)|e

这将跳过所有带有 ee 的单词和 me ,这意味着它将无法匹配 degree 中的任何内容和 zookeeper .

Demo

解决方案2
(?:ee|mee?)(*SKIP)(?!)|e

与解决方案 0 类似的问题。当有 3 个时 e连续第 2 个 emee? 匹配,留下第三个 e可供匹配。

解决方案3
(?:^.*[me]e)(*SKIP)(*FAIL)|e

这会将输入丢弃到最后一个 meee ,这意味着任何有效的 e最后一次之前 meee不会匹配,比如第一个 edegree .

Demo

关于regex - R: (*SKIP)(*FAIL) 多个模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29639562/

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