You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式匹配非单词组成部分的特定单词?

嘿,我明白你的问题了——你想匹配那些独立存在的特定单词(比如你的例子里的三个"on"),但要排除像"long"里作为子串的"on"对吧?你之前用的正则(?: |^)the|on|of(?: |$)之所以没生效,是因为这个正则的分支逻辑有问题:on是单独的一个分支,没有任何前后边界限制,所以它会匹配任何地方的"on"子串,包括"long"里的。

那咱们来修正这个问题,有两种靠谱的方案:

方案一:使用单词边界\b

正则里的\b表示单词边界,它匹配的是单词字符([a-zA-Z0-9_])和非单词字符之间的位置,或者字符串的开头/结尾。针对你的需求,匹配独立的"the"、"on"、"of",可以用:

\b(?:the|on|of)\b
  • 解释:
    • \b:开头的单词边界,确保目标单词前面不是单词字符(比如"long"里的"l"是单词字符,所以"long"里的"on"前面没有\b,不会被匹配)
    • (?:the|on|of):非捕获分组,用来匹配三个目标单词中的任意一个
    • \b:结尾的单词边界,确保目标单词后面不是单词字符

用你的示例文本测试的话,这个正则会精准匹配到三个独立的"on"和那个"the",完全不会碰"long"里的子串。

方案二:使用环视断言(更灵活的边界控制)

如果你不想把下划线_当成单词的一部分(\b会把_视为单词字符),可以用负向环视来定义边界:

(?<!\w)(?:the|on|of)(?!\w)
  • 解释:
    • (?<!\w):负向后视断言,确保目标单词前面不是任何单词字符(字母、数字、下划线)
    • (?!\w):负向前视断言,确保目标单词后面不是任何单词字符
      这个方案的边界判断更严格,适合不需要考虑下划线的场景。

测试示例(以Python为例)

import re

text = '<strong>on</strong> long <strong>on</strong> abc the <strong>on</strong>'
pattern = r'\b(?:the|on|of)\b'
matches = re.findall(pattern, text)
print(matches)  # 输出: ['on', 'on', 'the', 'on']

完全符合你的预期!

内容的提问来源于stack exchange,提问作者Ted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:43:19