字母表上的字符串{a,b,c,d}其中没有b
后面紧跟着a
,并且没有c
立即是d
。下列语言的正则表达式
这就是我想出来的,它在某些情况下失败了。 你可以让我知道我做错了什么。
a*(a|d)*(b(c|d|b)+)*(c(a|b|c)+)*(d(a|b|c|d)+)*
字母表上的字符串{a,b,c,d}其中没有b
后面紧跟着a
,并且没有c
立即是d
。下列语言的正则表达式
这就是我想出来的,它在某些情况下失败了。 你可以让我知道我做错了什么。
a*(a|d)*(b(c|d|b)+)*(c(a|b|c)+)*(d(a|b|c|d)+)*
空字符串,abc,acb怎么样? b [^ a]是否要求语言中有两个字符? – 2012-02-03 06:17:36
它在'dca'上失败,并且也接受'dce',即使它只支持'[abcd]' – 2012-02-03 06:19:57
@ dabble125,是的,你是对的。我转而采用负向预测。 – mowwwalker 2012-02-03 06:23:48
很多你的子表达式是这样的:
(c(a|b|c)+)
这是说“交流是必须遵循的一个{A,B,C}你想说什么。” AC不能其次是广告“,但这实际上并不是规则之一,这个表达式不允许只是一个单词”c“,它应该被接受。
这个子表达式的另一个问题是它可能会将c
与c
。该表达式匹配“cc”,该表达式后面的表达式为(d(a|b|c|d)+)*
,其将匹配“dc”,因此条带g“ccdc”与这两个表达式相匹配,这给了我们一个d
,跟在c
之后,这违反了规则。
所以问问自己。真的可以遵循c
?如果d
跟在c
之后,可以吗?很明显不是。如果a
跟在c
之后,可以吗?是。如果b
跟随着c,可以吗?是。所以我们很想写c(b|a)
。但是有一个c
必须遵循其中之一吗?没有。所以我们试试c(b|a)*
。但是,从上面我们可以看出,我们可能不希望我们的正则表达式“吃”b
,因为一旦我们有b
,我们不必担心b
后面的字母是否为a。所以我们可以在这里做的最好的是ca*
遵循相同的逻辑来找出与b
盯着东西的表达式。你拿出bd*
这些应该可以重复,所以我们得到(ca*|bd*)*
。这是怎么读的? “A c
可以跟着a
s。一个b
可以跟在d
s。这仍然没有让我们所有的方式。我们要确保t d
不会立即跟随c
。但我们允许的所有内容是d
后跟b
。由于“cad”不被我们的正则表达式接受,所以我们失败了。一旦我们在c
之后看到a
,d
就可以了。因此,我们需要一个表达式,表示“在ca
之后,然后允许a
和d
的任意组合。由于这是家庭作业,因此我没有给出完整的表达式。如果您仍在继续,您应该能够弄明白。
我们最那里的方式,唯一剩下的是要认识到我们不关心a
S和d
S如何来许多在字符串的开头,我们看到我们的第一个b
前或c
。但最终的正则表达式的格式为“a
s”和“d
”。然后我们有一个重复部分“如果我看到b
或c
我需要担心接下来会发生什么......
我相信这会给你。如果你不允许?
运营商,只是与*
替换它
这允许a
或d
接着什么;其次b
通过b,c,d
或终止的字符串,然后b,c,d
或终止字符串c
(a|d|(b+(c|d))|(c+(b|d)))*(b|c)*
拥有比密切配对更开放的配对。 – stew 2012-02-03 06:25:17
过分依赖智能编辑。固定。 – unpythonic 2012-02-03 06:30:42
这是否接受bba? – 2012-02-03 07:22:07
这是使用负前瞻很简单:
^(?!.*(ba|cd))[a-d]*
说明:
(ba|cd)
意味着要么ba
或cd
^(?!.*(ba|cd))
意味着从一开始就放眼望去(不消耗) (^
),应该有不是,在任何地方输入(.*
),无论是ba
或cd
[a-d]*
意味着任何数量的只有一个,B,C或d这对我有用:'(?!(ba | cd))[abcd]'非常优雅。 – 2012-02-03 06:29:57
或更短:(?!(ba | cd))[ad] – 2012-02-03 06:30:29
这会在无效字符后切断,而不是负面,只是一个特性 – 2012-02-03 06:33:20
(a|b(?!a)|c(?!d)|d)+
这个工程....但我会怎么做这...没有?或者 !
似乎失效,这永远这样,我做到这一点... IM王建宇,山西高等学校怀疑它甚至正则表达式
这听起来像一个计算机科学的问题,使之更适合[cstheory.se。无论如何,'nsregularexpression'标签适用于Objective-C中该名称的类,因此我将其删除。 – 2012-02-03 05:20:40