【问题标题】:Regex: Negating characters正则表达式:否定字符
【发布时间】:2012-04-24 08:42:00
【问题描述】:

快速提问 -

如何用 {x,y} 创建一种字符串语言,但用 (xy) 否定所有字符串?

到目前为止我的尝试:

\bx*[^(xy)]*y\b\by*[^(xy)]*x\b\b[^(xy)][xy]*[^(xy)]*\b

最后一个限制最少,但在 [^(xy)] 的多次使用中显得笨拙。

什么是完全否定包含 (xy) 但允许所有其他组合的字符串的最懒惰最方便的方法?

谢谢

已编辑: 允许的示例字符串:xxxxxxx yyyyyyyyy yxxxx yyyyyyxx

不允许的示例字符串:xxxxyxxx xyxxxx yyyyxyyy yyyxyxy 等

【问题讨论】:

  • 仅供参考 [^(xy)] 的意思是“一个字符不是(xy´ or a )`”。
  • @TimPietzcker 啊,这是我的问题。如何正确使用插入符号^ 来否定字符串而不仅仅是字符?是[^x][^y]吗?
  • 不,这就是可以使用否定前瞻断言的用途 - 请参阅 Joey 的回答。

标签: regex regex-negation


【解决方案1】:

如果我对挑战的理解正确,您所描述的字符串语言可以以任意数量的 y 开头,后跟任意数量的 x,因为它们是唯一允许的两个字符,并且您不能放置 y一旦出现 x,因为这会导致字符串“xy”出现。

\by*x*\b

当然,我假设您实际上是在寻找一种更通用的解决方案来解决那些不像您给出的那样简单的案例。在这种情况下,negative lookahead assertion 是最简单的解决方案。

【讨论】:

  • 不错的一个。没有注意到语言限制。我的答案消失了,因为它最初是错误的。
  • 完美解决我的问题!但我想在那里看到[^ 的用法,所以不要打勾:(
  • tetris11:你不能真的(至少优雅地)强制对带有否定 character 类的 string 进行否定匹配。
  • @Joey 啊,是的,我现在意识到积极的断言是我理想中所寻找的。 \b(?!xy)[xy]*\b 是最正确的。
  • tetris11:这将匹配不以 xy开头的单词。
【解决方案2】:

使用负前瞻

\b((?!xy)[xy])+\b

【讨论】:

  • 我将您的 . 更改为 [xy],因为这些是唯一允许的字符。此外,您可能想用 \b 替换 ^$ 锚点,因为看起来 OP 正在寻找更大字符串中的单词(但这是他的问题的猜测,有点不清楚)。
  • 即使使用 {x, y} 作为语言 . 也可以工作并且更简洁,恕我直言。如果您有一种语言,通常不会尝试过滤来自不同语言的单词。但是,是的,整个字符串与单词的部分有点模糊。
【解决方案3】:

试试:

\bx[^xy\s]*y\b

说明:

<!--
\bx[^xy\s]*y\b

Options: ^ and $ match at line breaks

Assert position at a word boundary «\b»
Match the character “x” literally «x»
Match a single character NOT present in the list below «[^xy\s]*»
   Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
   One of the characters “xy” «xy»
   A whitespace character (spaces, tabs, and line breaks) «\s»
Match the character “y” literally «y»
Assert position at a word boundary «\b»
-->

【讨论】:

  • 这允许xyxabcy 以及许多其他“非法”字符串。
  • 请您提供一些示例字符串来匹配和不匹配。所以,你的要求会更清楚。或者试试这个类比:\bx[^put_here_what_chars_you_want_to_negate]*?y\b...
猜你喜欢
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 2014-11-21
  • 2014-04-19
  • 2012-02-11
  • 1970-01-01
相关资源
最近更新 更多