编写没有递归规则的正则表达式

时间:2015-09-18 07:31:40

标签: regex recursion

我需要编写一个正则表达式规则,其中我所拥有的表达式没有递归规则。

例如,如果我需要写一个表达式,我可以有任意数量的a,b&s,c&s;和d' s但没有任何&# 39; s和d紧跟在任何一个b之后。但是,字符串和字母后面会出现在字符串中。

以下是我可以使用的所有规则: rules 试过这个:(a|d)* (c|b)* c* (a|d)*。但是,正如您所看到的,我需要不断重复才能使其发挥作用。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

你需要重新解释这个问题。

  

我可以拥有任意数量的a,b,s,c和d,但是没有任何一个和任何一个,并且d在b' S

换句话说,您可以(a|c|d)任意次,但是如果出现b,那么任意数量的(b|c):所以, (a|c|d)* (b (b|c)*) | ɛ)

它正式等于(a|c|d)* (b|c)*(您可能想弄清楚原因),但在实践中,尽管较短,但在使用常见的正则表达式算法进行评估时,这个会受到灾难性的失败。

(如果你想在计算/实际regexp上测试它,而不是理论上的,那么它会转换为[acd]*(?:b[bc]*)?。)

编辑:是的,误读了这个问题。 "紧接着"可能是一个很好的词选择。怎么样......

(a|c|d|b+c)*(b|ɛ)
(?:[acd]|(?:b+c))*b?

在这里解释逻辑,你可以使用任何字母,但是如果你使用b,你可以继续任意数量的b但是当你厌倦了下一个需要时成为c(如果您停止了b,那么唯一剩下的就是ac。然后它又回到了通常的程序。最后,您可以使用b,但不一定会有任何内容。

答案 1 :(得分:1)

您可以构建自动机并将其转换为正则表达式。 由于a和d不能在b:

之后

enter image description here

此处仅声明acdb已被接受。如果您接受空字,也可以接受START。

所以你可以从(a|c|d)开始。它可以在不改变状态的情况下重复自己(a|c|d)*。从状态b开始,您可以使用b*或一个c - 这会得到b*|c - > (b(b*|c))。这总计(((a|c|d)*)|(b(b*|c)))*