2012-04-24 106 views
2

快速问题 -正则表达式:否定字符

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

我尝试的到目前为止:其中最后的

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

是最少的限制,但似乎与笨拙的多个使用[^(XY)。

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

由于

Editted:被允许实施例的字符串:XXXXXXX YYYYYYYYY yxxxx yyyyyyxx

实施例的字符串是允许:xxxxyxxx xyxxxx yyyyxyyy yyyxyxy等

+1

FYI'[^(XY)]'的意思是“一个字符不是一个'(',一个' x','y'或')'“。 – 2012-04-24 08:57:08

+0

@TimPietzcker啊,这是我的问题。如何正确使用脱字符^ ^符号来取消字符串而不仅仅是一个字符?它是不是'[^ x] [^ y]'? – tetris11 2012-04-24 09:15:14

+0

不,这就是消极的前瞻断言可用于 - 见乔伊的答案。 – 2012-04-24 09:27:31

回答

3

如果我正确地理解了这个挑战,那么你就描述了一个字符串的语言,它可以以任意数量的y开头,后面是任意数量的x,因为这些字符只允许有两个字符,并且一旦x已出现,因为这会导致字符串“xy”出现。

\by*x*\b 

当然,我认为你其实找的是不是你给的一个简单的情况下更通用的解决方案。在这种情况下,negative lookahead assertion是最简单的解决方案。

+0

不错的一个。没有注意到语言限制。我的答案消失了,因为它最初是错误的。 – Joey 2012-04-24 08:56:02

+0

我的问题的完美答案!但是我想看看里面有'[^''的用法,所以没有打勾:( – tetris11 2012-04-24 09:21:27

+0

tetris11:你不能真的(至少优雅地)强制否定*字符*类的*字符串*的否定匹配。 – Joey 2012-04-24 11:26:11

1

使用负先行

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

我将'.'改为'[xy]',因为这些是唯一允许的字符。另外,你可能想用'\ b'代替'^ $'锚点,因为它看起来是OP正在寻找更大的字符串中的单词(但是这是从他的问题猜测,这有点不清楚)。 – 2012-04-24 08:56:07

+0

即使使用{* x *,* y *}作为语言'.'也可以工作,并且更简洁明了,恕我直言。如果您使用的是语言,通常不会尝试过滤来自其他语言的文字。但是,是的,整个字符串与单词有点模糊。 – Joey 2012-04-24 08:58:10

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» 
--> 
+0

这允许'xy'和'xabcy'以及许多其他“非法”字符串。 – 2012-04-24 08:53:20

+0

你能否提供一些样本字符串来匹配和不匹配。所以,你的要求会更清楚。或者试试这个比喻:''\ bx [^ put_here_what_chars_you_want_to_negate] *?y \ b'' ... – Cylian 2012-04-24 09:00:07