正则表达式:否定字符

时间:2012-04-24 08:42:00

标签: regex regex-negation

快速提问 -

如何用{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 etc

3 个答案:

答案 0 :(得分:3)

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

\by*x*\b

当然,我认为您实际上正在寻找一种更通用的解决方案,用于不像您提供的那样简单的案例。在这种情况下,negative lookahead assertion是最简单的解决方案。

答案 1 :(得分:1)

使用否定前瞻

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

答案 2 :(得分:0)

尝试:

\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»
-->