【问题标题】:Regex - Exclude patterns if a substring occurs anywhere within the string正则表达式 - 如果子字符串出现在字符串中的任何位置,则排除模式
【发布时间】:2020-07-23 02:24:50
【问题描述】:

问题:如何在模式匹配特定单词(查找单词)的同时忽略其中任何位置包含子字符串(单词 Exclude)的任何字符串?

我想要做的是找到所有包含单词 Find 的模式,并排除任何包含 Exclude 字符串中任何位置的模式。

我对模式匹配的期望是:

Find - Succeed
ExcludeFind - Fail
FineExclude - Fail
xxxFind - Succeed
Findxxx - Succeed
xxxFindxxx - Succeed
ExcludexxxxxxxxxxFind - Fail
FindxxxxxxxxxxExclude - Fail
ExcludexxxxxxxxxxFindxxxxxxxxxxExclude - Fail

我制作的正则表达式模式,其结果各不相同:

(\bFind\b) - Only works if Find is the only word
(\w?Find\w?) - Pattern matches any word with Find
((\w?Find\w?)([^Exclude])|([^Exclude])(\w?Find\w?)) - Image below

浏览了各种 Stack 帖子,我尝试了一种更复杂的方法,即正面和负面的lookbehinds,但它在任何模式上都没有成功。

(?<!Exclude)(Find)(?<=Exclude)

如果是(?&lt;!Exclude)(Find),那么这可行,但仅有的两个问题ExcludexxxxxxxxxxFindFindxxxxxxxxxxExclude 也成功了,我不希望这样,因为这些字符串包含“排除”字样。

我认为通配符变体可能会起作用 (?&lt;!Exclude)?(Find) 或类似的东西,但同样,没有模式匹配这种情况。

【问题讨论】:

  • 基本问题:它必须是一个正则表达式吗?如果您使用的是编程语言,使用不同的方法可能会更容易。
  • 顺便说一句,检查您的第三条测试行是否显示 Fine 而不是 Find

标签: regex


【解决方案1】:

这似乎有效:

^(?!.*Exclude).*Find

基本上是对Exclude的负前瞻,然后寻找Find

它匹配 4 行:1、4、5 和 6。它与“查找”之后的内容不匹配,但这可能不会影响您。如果您需要它来匹配整个字符串,请改用它,这样它也可以匹配之后出现的任何内容:

^(?!.*Exclude).*Find.*$

如果有其他问题,请在帮助下完成:

Regex to include certain words but exclude another

我从接受的答案中的正则表达式开始,只是替换字符串并删除斜杠,但我认为它仍然过于复杂,所以我开始删除东西,这是我能想到的最小的工作版本。

【讨论】:

  • 刚刚看到这个,但感谢这个安德鲁 - 工作完美。
  • @CarySwoveland,他似乎想匹配像Findxxx 这样的东西,所以这就是我没有包含任何边界的原因。
猜你喜欢
  • 1970-01-01
  • 2011-09-12
  • 2015-09-30
  • 2019-10-17
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
相关资源
最近更新 更多