regex - 嵌套正则表达式向前和向后看

标签 regex perl lookahead lookbehind regex-lookarounds

我在正则表达式中嵌套'+'/'-'lookahead/lookbehead时遇到问题。

假设我想用'*'更改字符串中的'%',并且说'\'转义了下一个字符。 (将正则表达式转换为类似命令^^的sql)。

所以字符串

  • '*test*'应该更改为'%test%'
  • '\\*test\\*'-> '\\%test\\%',但
  • '\*test\*''\\\*test\\\*'应该保持相同。

  • 我试过了:
    (?<!\\)(?=\\\\)*\*      but this doesn't work
    (?<!\\)((?=\\\\)*\*)    ...
    (?<!\\(?=\\\\)*)\*      ...
    (?=(?<!\\)(?=\\\\)*)\*  ...
    

    与上述示例中的*匹配的正确正则表达式是什么?
    (?<!\\(?=\\\\)*)\*(?=(?<!\\)(?=\\\\)*)\*之间有什么区别,或者如果它们本质上是错误的,则具有这种视觉构造的正则表达式之间的区别是什么?

    最佳答案

    要查找一个未转义的字符,您将寻找一个以偶数个(或零个)转义字符开头的字符。这是相对简单的。

    (?<=(?<!\\)(?:\\\\)*)\*        # this is explained in Tim Pietzcker' answer
    

    不幸的是,许多正则表达式引擎不支持可变长度后向查找,因此我们必须用前向查找代替:
    (?=(?<!\\)(?:\\\\)*\*)(\\*)\*  # also look at ridgerunner's improved version
    

    将其替换为组1的内容和一个%符号。

    解释
    (?=           # start look-ahead
      (?<!\\)     #   a position not preceded by a backslash (via look-behind)
      (?:\\\\)*   #   an even number of backslashes (don't capture them)
      \*          #   a star
    )             # end look-ahead. If found,
    (             # start group 1
      \\*         #   match any number of backslashes in front of the star
    )             # end group 1
    \*            # match the star itself
    

    前瞻确保仅考虑偶数个反斜杠。无论如何,没有办法将它们匹配到一个组中,因为前瞻不会使字符串中的位置前进。

    关于regex - 嵌套正则表达式向前和向后看,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7867179/

    相关文章:

    windows - 如何在 Windows 7/2008 中自动执行 perl 脚本?

    perl - 为什么脚本终止时不调用对象析构函数?

    c# - .NET 中的惰性正则表达式匹配。这里出了什么问题?

    r - 在特定短语后提取数字

    python - '(?='和 ')'在这里做什么?

    regex - php脚本中的Bash命令,根据特定列的值获取文件的某些行

    perl - 为什么正面前瞻会导致在我的 Perl 正则表达式中进行捕获?

    java - 匹配单词后跟空格和 N 个数字

    perl - 哪些 perl 代码示例会导致未定义的行为?

    正则表达式:两次比赛之间的否定超前