正则表达式匹配一个单词,但前提是它之前或之后没有另一个特定单词

Regex to match on a word but only if it isn't preceded or followed by another specific word

需要 Regex 字符串才能使用自定义 Exchange DLP "Sensitive Information" 类型。

即匹配 Smith 但不是 John Smith 或 Smith John

(?i)(?<!John\s)Smith 似乎适用于 "John Smith",但我不相信它是 100% 有效的。

(?i)(Smith.*\s(?!John)) 似乎适用于 "Smith John" 但如果后跟 space 或换行则无效。

尝试过以下方法将它们组合成一个字符串,但似乎根本不起作用。

(?i)(?<!John\s)Smith |(?i)(Smith.*\s(?!John))

(?i)(?<!John\s)Smith.*\s(?!John)

我犯了什么小学生错误?

(?i)(?<!John\s)Smith |(?i)(Smith.*\s(?!John)) 模式匹配前面没有 John+ 1 个空格的 Smith,或者后面跟任意数量字符的 Smith带有不紧跟 John 的空格。因此,它在很多位置都匹配 Smith

(?i)(?<!John\s)Smith.*\s(?!John) 模式抓取一个 Smith 没有紧跟 John + 空格,以及所有文本到最后一个没有紧跟 [=13 的空格=].

确保 \s 模式在前瞻内:

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

regex demo

详情

  • (?i) - 不区分大小写的内联修饰符
  • (?<!John\s) - 没有紧跟 Hohn 和空白字符
  • 的位置
  • Smith - 文字子串
  • (?!\s+John) - Smith 子字符串不应紧跟 1+ 个空格(或者如果您使用 \s*,则不应紧跟 0+ 个空格)和子字符串 John.