【问题标题】:Regex that does not match number if surrounded by specific pattern如果被特定模式包围,则与数字不匹配的正则表达式
【发布时间】:2017-09-17 22:07:49
【问题描述】:

我正在寻找一个正则表达式,它将匹配某些内容(包含重复),但前提是它前面没有等号字符 (=) 并且只有在它后面没有和号字符 (&) 的情况下。

例如,假设要匹配的内容由CONTENT 表示。我认为这个问题并不重要,只是匹配的内容很长,因此我无法在我正在使用的应用程序中复制所有内容。 CONTENT 可以出现在 blob 中的任何位置,而且它也可能是唯一的。

CONTENT         // OK, should match
fooCONTENT      // OK, should match
CONTENTfoo      // OK, should match
fooCONTENTfoo   // OK, should match
=CONTENT        // OK, should match
CONTENT&        // OK, should match
=CONTENT&       // NO - SHOULD NOT MATCH

我尝试了这样的模式:

(?!=CONTENT&)CONTENT...

但排除 =CONTENT& 不起作用,可能是因为正则表达式引擎只是简单地移动到前导 = 之后,然后满足了前瞻。

我考虑过在CONTENT 之后做一个否定的lookbehind,但由于CONTENT 包含重复,这是不可能的(look behinds 必须有一个固定长度的模式)。

【问题讨论】:

  • 您是要匹配单个字符串,还是该内容会出现在文本中的任何位置,例如?
  • ^[^=].*[^&]$ 将匹配您想要的模式。
  • 你说CONTENT重复自己是什么意思?
  • CONTENT 包含重复的意思,后面跟着 +、* 和/或 {N}。
  • [^=].*[^&] 很有趣(而且易于启动)。看来我是想多了。该解决方案的唯一问题(我认为)是它前后至少需要一个字符。因此,如果 CONTENT 位于 blob 的开头或结尾(或者如果它是整个 blob),那么它将不匹配。就我而言,这个要求可能不是问题。另一个问题是之前的字符和之后的字符将是 matched 内容的一部分,而我只想要CONTENT

标签: regex lookaround


【解决方案1】:

据我了解,您正在尝试匹配 Content 任一,前面是 = 或后面是 &,但不能同时匹配。

您可以通过如下方式使用alteration来实现。

正则表达式: ^=?[^=&]+$|^[^=&]+&?$

说明:

^=?[^=&]+$ 查找可选的=,后跟除=& 之外的多个字符。

^[^=&]+&?$ 查找除=& 之外的多个字符,后跟可选的&

| 是强制匹配任一声明模式的更改。

Regex101 Demo

【讨论】:

  • 谢谢。这是一个有趣的方法。我会试一试,但就我而言,我在比赛的“主要”部分之前和之后都有环顾四周。并且匹配的主要部分内部包含lookarounds,因此不能放入字符集中。可以将这样的更改用于无法放入字符集中的模式吗?
  • @codesniffer:你能在你的问题中解释一下吗?我没有关注你。
  • 想象一下我的号码的模式是这样的:(?!123|222|999)\d{3}(?:[ ]+|[-_]?[ ]+)\d{5,7}(?![\d-])(实际情况比这更复杂)。考虑到它不能放在字符集中,这种模式可以与您的建议一起使用吗?
  • 如果您的意思是它可以替换[ ]+|[-_]?[ ]+,那么可以。因为它在非捕获组内,不会影响环视断言。但随后锚点 ^$ 必须取决于您的 复杂 正则表达式。
  • @codesniffer:我认为你应该放下你最初的规范和你所做的尝试。这样你可能会得到社区更好的回应。
猜你喜欢
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多