我有一个这样的多行字符串:
SA21 abcdef
BKxyz
SA21 abcdef
我需要一个仅在行^SA21 abcdef$
出现一次时才匹配的正则表达式。所以它不应该匹配第一个例子,但它应匹配这个:
BK udsia
SA21 abcdef
BKxyz
我尝试捕获该行并确保它仅在以后找不到同一行时匹配:/(^SA21 abcdef$)(?!\1)/m
regex101但这不起作用,因为它可能总是匹配最后一行。 。
答案 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$).*)*
- 字符串结束。