正则表达式匹配一个单词,但前提是该单词不位于另一个特定单词之前或之后

时间:2018-09-20 11:26:20

标签: regex exchange-server regex-lookarounds

需要使用正则表达式字符串以使用自定义Exchange DLP“敏感信息”类型。

即在史密斯上进行比赛,但如果约翰·史密斯或史密斯·约翰则不参加

(?i)(?<!John\s)Smith似乎适用于“约翰·史密斯”,尽管我不确定它的效率是100%。

(?i)(Smith.*\s(?!John))似乎适用于“史密斯·约翰(Smith John)”,但如果后面加空格或换行则无效。

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

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

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

我在做什么小学生错误?

1 个答案:

答案 0 :(得分:2)

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

(?i)(?<!John\s)Smith.*\s(?!John)模式捕获的Smith不能紧跟John +空格,所有文本直到最后一个空格都不能紧跟John

确保\s模式在超前区域内:

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

请参见regex demo

详细信息

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