仅在没有找到重复行时匹配的正则表达式

时间:2016-07-22 10:46:02

标签: regex multiline

我有一个这样的多行字符串:

SA21 abcdef
BKxyz
SA21 abcdef

我需要一个仅在行^SA21 abcdef$出现一次时才匹配的正则表达式。所以它不应该匹配第一个例子,但它应匹配这个:

BK udsia
SA21 abcdef
BKxyz

我尝试捕获该行并确保它仅在以后找不到同一行时匹配:/(^SA21 abcdef$)(?!\1)/m regex101但这不起作用,因为它可能总是匹配最后一行。 。

1 个答案:

答案 0 :(得分:2)

如果在单次出现该行之前或之后该行不存在,则所需的正则表达式应仅匹配。这是通过一个驯化的贪婪令牌来实现的:

"='Supplies - Factor'!G36326"

请参阅regex demo

/\A(?:(?!^SA21 abcdef$).)*(^SA21 abcdef$)(?:(?!^SA21 abcdef$).)*\z/ms 是匹配任何文字的标记,但是(?:(?!^SA21 abcdef$).)*行的开头。 SA21 abcdef修饰符是必需的,以便/s可以匹配换行符。

但是,该构造是消耗资源的,并且最好将其展开:

.

请参阅another demo

请注意,/\A(?:\n+(?!SA21 abcdef$).*)*\n*^(SA21 abcdef)$(?:\n+(?!SA21 abcdef$).*)*\z/m \A是明确的开始/结束字符串锚点,\z修饰符不会影响它们。

模式说明

  • /m - 字符串开头
  • \A - 零个或多个序列:
    • (?:\n+(?!SA21 abcdef$).*)* - 一个或多个换行符......
    • \n+ - 未跟随整个行的(?!SA21 abcdef$)
    • SA21 abcdef - 除换行符之外的零个或多个字符
  • .* - 零个或多个换行符
  • \n* - 开始行
  • ^ - 必须单行
  • (SA21 abcdef) - 行尾
  • $ - 见上文
  • (?:\n+(?!SA21 abcdef$).*)* - 字符串结束。