【问题标题】:regex: lookbehind assertation正则表达式:后向断言
【发布时间】:2013-10-23 01:20:30
【问题描述】:

我使用 ((\d)(\d(?!\2))((?<!\3)\d(?!\3)))\1 来匹配不同的一行排序的任意数字:

234234、345345、359359 但不匹配 211211、355355(删除后向断言将匹配这些)

我发现在 PHP 中使用 preg_match() 运行时模式出错,因为偏移量的长度必须固定,但在其他调试器中测试时正常(在这种情况下我使用 kodos)

preg_match_all():编译失败:后向断言在偏移量 23 处不是固定长度

是否有任何替代模式来匹配上面的排序数字? 245245 或其他符合 ABCABC 格式模式的数字。

【问题讨论】:

    标签: php regex


    【解决方案1】:

    如果 3 位数字必须不同,您可以使用:

    ((\d)(?!.?\2)(\d)(?!\3)\d)\1
    

    但如果545545 被允许,您可以使用:

    ((\d)(?!\2)(\d)(?!\3)\d)\1
    

    【讨论】:

    • 出于好奇,请您解释一下((\d)(?!.?\2)(\d)(?!\3)\d)\1 中的.? 是如何工作的,我没明白:/
    • @Enissay: .? 是一个可选字符,那么断言(?!.?\2) 等价于(?!(?:\2|.\2)) 并检查第二个数字是否不同以及第三个数字是否不同一口气。
    • (?!.?\2) is equivalent to (?!(?:\2|.\2)) 这就是我要找的,谢谢
    【解决方案2】:

    问题在于向后看,这将其变成了向前看,似乎对我有用regex101

    ((\d)(\d(?!\2))(?!\3)(\d(?!\3)))\1
    

    【讨论】:

    • 这里的所有答案都可以正常工作,但我选择匹配每个组以确保未来的安全
    【解决方案3】:

    只使用前瞻而不是后瞻?

    ((\d)(?!\2)(\d)(?!\2|\3)\d)\1
    

    Regex Explainer解释:

    -------------------------------------------------- ------------------------------ (分组并捕获到 \1: -------------------------------------------------- ------------------------------ (分组并捕获到 \2: -------------------------------------------------- ------------------------------ \d 位 (0-9) -------------------------------------------------- ------------------------------ ) \2 结尾 -------------------------------------------------- ------------------------------ (?! 向前看,看看是否没有: -------------------------------------------------- ------------------------------ \2 捕获匹配的内容 \2 -------------------------------------------------- ------------------------------ ) 前瞻结束 -------------------------------------------------- ------------------------------ (分组并捕获到 \3: -------------------------------------------------- ------------------------------ \d 位 (0-9) -------------------------------------------------- ------------------------------ ) \3 结尾 -------------------------------------------------- ------------------------------ (?! 向前看,看看是否没有: -------------------------------------------------- ------------------------------ \2 捕获匹配的内容 \2 -------------------------------------------------- ------------------------------ |或者 -------------------------------------------------- ------------------------------ \3 捕获匹配的内容 \3 -------------------------------------------------- ------------------------------ ) 前瞻结束 -------------------------------------------------- ------------------------------ \d 位 (0-9) -------------------------------------------------- ------------------------------ ) \1 结尾 -------------------------------------------------- ------------------------------ \1 捕获匹配的内容 \1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多