正则表达式查找包含给定序列并排除特定单词的单词

时间:2016-05-12 08:57:56

标签: regex

我想找到包含给定字母序列的单词。但是,这个词应该与给定的禁止词不同。

例如在 " modal dalaman odal Modal ODAL amodal modalex amodale" 如果序列是" dal"被禁止的单词是模态的,我想得到dalaman,odal,ODAL,amodal,modalex,amodale。

我怎样才能在正则表达式中这样做?顺便说一句,这个问题没有特定的编程语言。

1 个答案:

答案 0 :(得分:1)

您可以使用以下此模式匹配包含" bar"的所有字词。但不等于"模态"全文。

模式:

\w*dal(?<!\bmodal\b)\w*

说明:

  • \w*匹配任意数量的字词(字母数字和下划线&#34; _&#34;),包括零
  • dal匹配序列&#34; dal&#34;字面上
  • (?<!\bmodal\b)是一个消极的外观,它可以保证序列&#34;模态&#34;无法在此令牌的左侧立即匹配。
    \b仅在字边界处匹配,但不会消耗任何字符。
  • \w*匹配任意数量的字词(字母数字和下划线&#34; _&#34;),包括零

Check this regex out on regex101.com

这是我的回答的旧版本,在更新问题之前有效:

您可以将下面的模式与i(不区分大小写)标记一起使用 根据您用于处理正则表达式的编程语言或环境,您可能还必须设置g(全局)标志以匹配模式的所有单独出现,或使用搜索所有模式的环境方法匹配,例如在Python re.findall()中。

模式:

\S*(?<!mo)dal\S*

说明:

  • \S*匹配任意数量的非空白字符,包括零
  • (?<!mo)是一个消极的外观,它确保了序列&#34; mo&#34;无法在此令牌的左侧立即匹配
  • dal匹配序列&#34; dal&#34;字面上
  • \S*匹配任意数量的非空白字符,包括零

Check this regex out on regex101.com

更一般地说,你可以使用这种模式:

\S*(?<!%%FORBIDDEN_LEFT%%)%%REQUIRED%%(?!%%FORBIDDEN_RIGHT%%)\S*

将占位符%%REQUIRED%%%%FORBIDDEN_LEFT%%%%FORBIDDEN_RIGHT%%替换为您需要的任何字符串后。

例如,如果你想匹配&#34; cd&#34;但不是&#34; abcdef&#34;,你必须使用模式\S*(?<!ab)cd(?!ef)\S*