只匹配一个单词,但前后不可出现特定的另一个单词:正则表达式

3
需要一个正则表达式字符串来处理自定义Exchange DLP“敏感信息”类型。
例如,匹配Smith但不匹配John Smith或Smith John。 (?i)(?<!John\s)Smith 似乎适用于“John Smith”,但我并不确定它是否100%有效。 (?i)(Smith.*\s(?!John)) 对于“Smith John”似乎可以工作,但如果后面跟随空格或换行符,则无法工作。
尝试将它们结合成一个字符串,但似乎根本无法工作。 (?i)(?<!John\s)Smith |(?i)(Smith.*\s(?!John)) (?i)(?<!John\s)Smith.*\s(?!John) 我犯了什么错误?

1
使用(?i)(?<!John\s)Smith(?!\s+John),见demo - Wiktor Stribiżew
1个回答

3

(?i)(?<!John\s)Smith |(?i)(Smith.*\s(?!John))模式匹配不带John+1个空格的Smith,或者跟随任意数量字符和不紧接着John的空格的Smith。因此,它可以匹配许多位置中的Smith

(?i)(?<!John\s)Smith.*\s(?!John)模式抓取不紧接着John+空格的Smith,以及直到最后一个未立即跟随John的空格的所有文本。

确保\s模式位于前瞻中:

(?i)(?<!John\s)Smith(?!\s+John)

请查看正则表达式演示

细节

  • (?i) - 不区分大小写的行内修饰符
  • (?<!John\s) - 不立即跟在Hohn和一个空格字符之后的位置
  • Smith - 一个文字子串
  • (?!\s+John) - Smith子串不应立即跟随1个或多个空格(如果您使用\s*,则为0个或多个空格)和子串John

1
感谢您的解释。 - Glen Liddell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接