字母{a,b,c,d}上的字符串b
后面没有a
,c
后面没有d
。
这是我提出的,但在某些情况下失败了。 你能不能让我知道我做错了什么。
a*(a|d)*(b(c|d|b)+)*(c(a|b|c)+)*(d(a|b|c|d)+)*
答案 0 :(得分:2)
使用否定预测非常简单:
^(?!.*(ba|cd))[a-d]*
说明:
(ba|cd)
表示 ba
或cd
^(?!.*(ba|cd))
表示从一开始(^
)向前看(不消费),输入中的任何位置都应不(.*
), ba
或cd
[a-d]*
表示任意数量的a,b,c或d 答案 1 :(得分:1)
许多子表达式如下所示:
(c(a|b|c)+)
这表示“ac必须跟随{a,b,c}之一。你试图说”ac不能跟广告“,但这实际上并不是规则之一。这个表达式确实如此。不允许只接受一个应该被接受的“c”。
此子表达式的另一个问题是它可能会将c
与c
配对。此表达式匹配“cc”,此表达式后面的表达式(d(a|b|c|d)+)*
将匹配“dc”,因此字符串“ccdc”与这两个表达式匹配,这使我们得到d
c
,这是违反规则的。
所以问问自己。什么才能关注c
?如果d
跟c
一样可以吗?显然不是。如果a
跟c
之后,可以吗?是。如果b
跟随c,可以吗?是。所以我们很想写c(b|a)
。但是c
是否必须遵循其中之一?没有。所以让我们试试c(b|a)*
。但是,正如我们从上面看到的,我们可能不希望我们的正则表达式“吃掉”b
,因为一旦我们有b
,我们不得不担心{{1}之后的字母是一个或不是。所以我们在这里做的最好的是b
遵循相同的逻辑,找出与ca*
一起凝视的事物的表达式。你想出了b
这些应该可以重复,所以我们得到bd*
。这是怎么读的? “(ca*|bd*)*
之后可以跟c
。a
之后可以跟b
。{这仍然不能让我们一路走来。我们想让确定
d
不会立即跟随d
。但我们所允许的只是c
跟随d
。我们失败了,因为我们的正则表达式不接受“cad”。一旦我们在b
之后看到a
,c
就可以了。因此,我们需要一个表达式来表示“在d
之后ca*
和ca
的任意组合,而不是a
,因为这是作业,我不是充分表达。如果你还在继续,你应该能够弄清楚。
我们大部分都在那里。剩下的唯一事情就是要意识到,在我们看到第一个d
或{{1}之前,我们并不关心字符串开头有多少a
和d
s }。但最终的正则表达式将在字符串的开头具有“b
s和c
s的形式。然后我们有一个重复的部分”如果我看到a
或{ {1}}我需要担心接下来会发生什么......
答案 2 :(得分:1)
我相信这会给你。如果您不允许使用?
运算符,只需将其替换为*
。
这允许a
或d
后跟任何内容; b
后跟b,c,d
或终止字符串,c
后跟b,c,d
或终止字符串。
(a|d|(b+(c|d))|(c+(b|d)))*(b|c)*
答案 3 :(得分:0)
答案 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)+
这有效......但我怎么能做到......没有?或者 !
它似乎失败了我做的任何事情......我开始怀疑它甚至是正则表达式