正则表达式匹配同一句子中无英文句号分隔的两个单词
匹配同一句子中未被句号分隔的两个单词的正则方案
嘿,我之前刚好处理过类似的需求,咱们直接来拆解解决思路:
核心正则表达式
假设你要匹配的两个目标单词是hello和there,可以用这个正则(支持单词顺序互换):
\b(hello)\b(?:(?!\.).)*?\b(there)\b|\b(there)\b(?:(?!\.).)*?\b(hello)\b
各部分解释
\b:单词边界,确保匹配的是完整单词,不会把helloworld误判为hello(hello)/(there):捕获组,用来定位你要找的目标单词(?:(?!\.).)*?:这是关键的"防句号"逻辑:(?!\.)是负向前瞻断言,保证接下来的字符不是英文句号.*?是非贪婪模式的任意字符匹配,避免过度匹配到其他句子里的内容(?:...)是一个非捕获组,不会额外存储匹配结果,只用来包裹逻辑
- 竖线
|:用来同时匹配两个单词的两种顺序(hello在前/there在前)
实用修饰符
根据你的场景可以添加这些修饰符:
i:不区分大小写,比如能匹配Hello、THERE这类变体s:允许.匹配换行符,适用于句子跨多行但没句号的情况
示例验证
咱们用你给出的例子测试:
示例1:
My name is Danny. Hello. I am there. whats up ?
这里Hello和there被句号分隔在不同句子,正则不会匹配到任何结果
示例2:
My name is Danny. Hello there. whats up ?
两个单词处于同一个句号分隔的片段里,正则会成功匹配到Hello there
自定义修改
如果要匹配其他单词组合,只需要把正则里的hello和there替换成你的目标单词就行,比如要匹配apple和banana,直接改成:
\b(apple)\b(?:(?!\.).)*?\b(banana)\b|\b(banana)\b(?:(?!\.).)*?\b(apple)\b
内容的提问来源于stack exchange,提问作者Irad
相关产品推荐
相关产品推荐

