如何查找具有相同数字1和0的正则表达式。 我也对你如何看待这样的解决方案感兴趣?
例如: 应匹配:1100,00100111,01。 不应该匹配:110,0,111001。
我需要正则表达式,它给出了所有这些字符串的集合。
如果2n
中正则表达式给出的字符串长度,则0s
的数量应等于数字1s = n
。
答案 0 :(得分:5)
无法为语言L =(0,1)生成正则表达式(相同数量的1和0)。这不是常规语言,因此无法使用正则表达式进行描述。它不常见,因为接受它的自动机需要不同的内存量,具体取决于输入的长度。常规语言是使用常量内存的语言,无论输入的长度如何。您描述的语言可以通过Context Free Grammar生成,但不能生成正则表达式。 以下CFG生成字符串,其中0的数量和1的数量相等。如果S是该语言中的任何单词: S - > SS; S - > 0S1; S - > 1S0; S - >这个空话 对于这种语言,你需要一个堆栈,可以设计一个下推自动机来接受它,或者一个图灵机。
答案 1 :(得分:3)
常规语法(有限状态自动机)不可能:http://en.wikipedia.org/wiki/Regular_language
答案 2 :(得分:3)
这是.NET引擎的正则表达式模式,可以满足您的需求。请参阅ideone.com中的实际操作。
^((?(D)(?!))(?<C>1)|(?(D)(?!))(?<-C>0)|(?(C)(?!))(?<D>0)|(?(C)(?!))(?<-D>1))*(?(C)(?!))(?(D)(?!))$
它的工作原理是使用两个堆栈,使用一个(C),如果当前有超过0的1,而另一个(D),如果有更多的零,则使用。(/ p>
不漂亮,绝对不可用,但它有效。 (哈!)
答案 3 :(得分:1)
虽然这在另一个答案中所述的常规语法是不可能的,但是扫描字符串应该相对容易,为每个1
增加一个计数器并为每个0
减少它。如果最终计数为0,那么0
s和1
s的数量是相等的(模2 ^字大小 - 注意溢出会使它有点棘手,但取决于是否还有其他关于输入的假设,可能没有必要)。