gpt4 book ai didi

regex - 是否可以使用条件正则表达式更喜欢以后的匹配?

转载 作者:行者123 更新时间:2023-12-04 08:47:41 25 4
gpt4 key购买 nike

假设一个人想要匹配一个任意数字,即前面或后面是某个字符串。但是,如果可能,模式应该总是倾向于匹配数字后跟字符串的子字符串。
例如:

  • 字符串 1234 foo应该匹配。
  • 字符串 foo 1234应该匹配。
  • 字符串 1234 foo 1234应该产生匹配 1234 foo .
  • (最重要的)字符串 foo 1234 foo应该产生匹配 1234 foo而不是 foo 1234 .

  • 为了避免两次使用相同的表达式,只用 or 反转和分隔,我一直在尝试使用条件模式来实现它。使用下面的模式适用于案例 1-3,但对于案例 4 失败,因为它匹配 foo 1234 .
    (\d+)?(?:(?(1) ?)(foo) ??)(?(1)|(?:(\d+)))
    向如下所示的条件添加负面预测也无济于事。字符串 foo 1234 foo现在产生两个匹配 foo 1234 foo .
    (\d+)?(?:(?(1) ?)(foo) ??)(?(1)|(?:(\d+)(?! ?foo)))
    由于正则表达式是贪婪的,它总是首先匹配情况 4 中的非首选子字符串。有没有办法让正则表达式更喜欢后面的匹配条件表达式?

    最佳答案

    好的,如果你不想重复使用 foo除非它在前瞻中,否则我相信以下模式将满足您的所有条件:

    (\d+)?(?(1) )(foo)(?(1)| (\d+)\b(?! foo))
    Demo .
    故障:
    (\d+)?          # An optional capturing group matching one or more digits.
    (?(1) ) # If the previous group exists, match a space character.
    (foo) # A second capturing group to capture "foo".
    (? # If...
    (1) # ..the first group exists, match nothing.
    | # Else...
    [ ] # Match a space character.
    (\d+) # A third capturing group matching one or more digits.
    \b # Assert a word boundary to make sure no more digits following.
    (?! foo) # A negative Lookahead to make sure " foo" is not following.
    ) # End If.
    如果数字不必以单词边界结尾,则最后一部分的另一种方法是去掉 \b并添加 \d*在负前瞻中:
    (\d+)?(?(1) )(foo)(?(1)| (\d+)(?!\d* foo))
    Demo .

    另一种解决方案是将第三个数字捕获组包装在一个原子组中,以防止在后面的负前瞻中回溯。这解决了第一个解决方案的问题,这样数字子字符串和 foo 之间不必有单词边界。它还解决了第二个解决方案的问题,因此它允许数字子字符串更复杂(例如包括小数 \d+.?\d*)。
    (积分归 OP, Ferdinand Schlatt)
    (\d+)?(?(1) )(foo)(?(1)| (?>(\d+))(?! foo))
    Demo

    关于regex - 是否可以使用条件正则表达式更喜欢以后的匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64225829/

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