2012-02-03 125 views
3

字母表上的字符串{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

这听起来像一个计算机科学的问题,使之更适合[cstheory.se。无论如何,'nsregularexpression'标签适用于Objective-C中该名称的类,因此我将其删除。 – 2012-02-03 05:20:40

回答

0

我得到了什么:

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

测试:

http://gskinner.com/RegExr/

+0

空字符串,abc,acb怎么样? b [^ a]是否要求语言中有两个字符? – 2012-02-03 06:17:36

+0

它在'dca'上失败,并且也接受'dce',即使它只支持'[abcd]' – 2012-02-03 06:19:57

+0

@ dabble125,是的,你是对的。我转而采用负向预测。 – mowwwalker 2012-02-03 06:23:48

0

试试这个:

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

它确保了没有a遵循b,并且没有b在其前面有a。它确保没有d跟在c之后,并且没有c在其前面有d

此外,如果您要添加其他任何内容,我会将其包装在()中。

+0

它无法匹配“c” – stew 2012-02-03 06:25:55

+0

不,它不会...它匹配前面没有广告的任何c – 2012-02-03 06:28:01

+0

对不起,我认为我的评论和你的编辑交叉路径:) – stew 2012-02-03 06:32:55

1

很多你的子表达式是这样的:

(c(a|b|c)+) 

这是说“交流是必须遵循的一个{A,B,C}你想说什么。” AC不能其次是广告“,但这实际上并不是规则之一,这个表达式不允许只是一个单词”c“,它应该被接受。

这个子表达式的另一个问题是它可能会将cc。该表达式匹配“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之后看到ad就可以了。因此,我们需要一个表达式,表示“在ca之后,然后允许ad的任意组合。由于这是家庭作业,因此我没有给出完整的表达式。如果您仍在继续,您应该能够弄明白。

我们最那里的方式,唯一剩下的是要认识到我们不关心a S和d S如何来许多在字符串的开头,我们看到我们的第一个b前或c。但最终的正则表达式的格式为“a s”和“d”。然后我们有一个重复部分“如果我看到bc我需要担心接下来会发生什么......

1

我相信这会给你。如果你不允许?运营商,只是与*替换它

这允许ad接着什么;其次b通过b,c,d或终止的字符串,然后b,c,d或终止字符串c

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

拥有比密切配对更开放的配对。 – stew 2012-02-03 06:25:17

+0

过分依赖智能编辑。固定。 – unpythonic 2012-02-03 06:30:42

+0

这是否接受bba? – 2012-02-03 07:22:07

2

这是使用负前瞻很简单:

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

说明:

  • (ba|cd)意味着要么bacd
  • ^(?!.*(ba|cd))意味着从一开始就放眼望去(不消耗) (^),应该有不是,在任何地方输入(.*),无论是bacd
  • [a-d]*意味着任何数量的只有一个,B,C或d
+0

这对我有用:'(?!(ba | cd))[abcd]'非常优雅。 – 2012-02-03 06:29:57

+0

或更短:(?!(ba | cd))[ad] – 2012-02-03 06:30:29

+0

这会在无效字符后切断,而不是负面,只是一个特性 – 2012-02-03 06:33:20

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

这个工程....但我会怎么做这...没有?或者 !

似乎失效,这永远这样,我做到这一点... IM王建宇,山西高等学校怀疑它甚至正则表达式