正则表达式用于以下语言

时间:2012-02-03 01:00:48

标签: regex

字母{a,b,c,d}上的字符串b后面没有ac后面没有d

这是我提出的,但在某些情况下失败了。 你能不能让我知道我做错了什么。

a*(a|d)*(b(c|d|b)+)*(c(a|b|c)+)*(d(a|b|c|d)+)*

6 个答案:

答案 0 :(得分:2)

使用否定预测非常简单:

^(?!.*(ba|cd))[a-d]*

说明:

  • (ba|cd)表示 bacd
  • ^(?!.*(ba|cd))表示从一开始(^)向前看(不消费),输入中的任何位置都应.*), bacd
  • [a-d]*表示任意数量的a,b,c或d

答案 1 :(得分:1)

许多子表达式如下所示:

(c(a|b|c)+)

这表示“ac必须跟随{a,b,c}之一。你试图说”ac不能跟广告“,但这实际上并不是规则之一。这个表达式确实如此。不允许只接受一个应该被接受的“c”。

此子表达式的另一个问题是它可能会将cc配对。此表达式匹配“cc”,此表达式后面的表达式(d(a|b|c|d)+)*将匹配“dc”,因此字符串“ccdc”与这两个表达式匹配,这使我们得到d c,这是违反规则的。

所以问问自己。什么才能关注c?如果dc一样可以吗?显然不是。如果ac之后,可以吗?是。如果b跟随c,可以吗?是。所以我们很想写c(b|a)。但是c是否必须遵循其中之一?没有。所以让我们试试c(b|a)*。但是,正如我们从上面看到的,我们可能不希望我们的正则表达式“吃掉”b,因为一旦我们有b,我们不得不担心{{1}之后的字母是一个或不是。所以我们在这里做的最好的是b

遵循相同的逻辑,找出与ca*一起凝视的事物的表达式。你想出了b

这些应该可以重复,所以我们得到bd*。这是怎么读的? “(ca*|bd*)*之后可以跟ca之后可以跟b。{这仍然不能让我们一路走来。我们想让确定 d不会立即跟随d。但我们所允许的只是c跟随d。我们失败了,因为我们的正则表达式不接受“cad”。一旦我们在b之后看到ac就可以了。因此,我们需要一个表达式来表示“在d之后ca*ca的任意组合,而不是a,因为这是作业,我不是充分表达。如果你还在继续,你应该能够弄清楚。

我们大部分都在那里。剩下的唯一事情就是要意识到,在我们看到第一个d或{{1}之前,我们并不关心字符串开头有多少ad s }。但最终的正则表达式将在字符串的开头具有“b s和c s的形式。然后我们有一个重复的部分”如果我看到a或{ {1}}我需要担心接下来会发生什么......

答案 2 :(得分:1)

我相信这会给你。如果您不允许使用?运算符,只需将其替换为*

这允许ad后跟任何内容; b后跟b,c,d或终止字符串,c后跟b,c,d或终止字符串。

    (a|d|(b+(c|d))|(c+(b|d)))*(b|c)*

答案 3 :(得分:0)

我得到了什么:

(a|b(?!a)|c(?!d)|d)+

测试:

http://gskinner.com/RegExr/

答案 4 :(得分:0)

试试这个:

(?<!b)a|(?<!c)d|b(?!a)|c(?!d)

确保a后面没有b,并且b前面没有a。它确保d后面没有c,并且c前面没有d

另外,如果您要为其添加任何其他内容,我会将其换成()

答案 5 :(得分:0)

(a|b(?!a)|c(?!d)|d)+

这有效......但我怎么能做到......没有?或者 !

它似乎失败了我做的任何事情......我开始怀疑它甚至是正则表达式