如何用正则实现:特定单词未出现在另一单词前时匹配,反之不匹配?
单词顺序验证的正则解决方案
你需要实现的规则是:当name出现在Jack之前时,不匹配Jack;当name未出现时,匹配Jack,且两词之间可存在其他内容。
之前的正则(?<!name)\b(Jack)\b仅能处理两词相邻的场景,无法应对中间有其他单词的情况,这里给出两种通用解决方案:
方案1:判断整个字符串是否符合要求
如果需要验证整个字符串是否满足「存在Jack且name不在Jack之前」或「无name但有Jack」,使用以下正则:
^(?!.*\bname\b.*\bJack\b).*\bJack\b
原理
^(?!.*\bname\b.*\bJack\b):正向否定预查,断言整个字符串中不存在name在Jack之前的结构。只要name出现在Jack前面,该断言直接失败,正则不匹配。.*\bJack\b:在断言成立的前提下,匹配包含Jack的完整字符串。
方案2:精准匹配符合条件的Jack单词
如果需要在文本中单独匹配所有符合要求的Jack单词,使用以下兼容多数正则引擎的写法:
\bJack\b(?!.*\bname\b)|(?<=^(?:(?!\bname\b).)*)\bJack\b
原理
\bJack\b(?!.*\bname\b):匹配文本中无name时的所有Jack。(?<=^(?:(?!\bname\b).)*)\bJack\b:匹配从字符串开头到Jack之间未出现name的Jack(即Jack在name之前的情况)。
测试示例
- 字符串
My name is Jack Brown:name在Jack之前,正则无匹配结果。 - 字符串
My Jack is name Brown:Jack在name之前,正则匹配Jack。 - 字符串
My friend is Jack:无name,正则匹配Jack。
内容的提问来源于stack exchange,提问作者kakajan
相关产品推荐
相关产品推荐

