如何找到数量相等的 1 和 0 的正则表达式。我也对您如何看待这种解决方案感兴趣?
例如:应该匹配:1100、00100111、01。不应该匹配:110、0、11001。
我需要正则表达式,它给出了所有这些字符串的集合。如果集合中的字符串长度由正则表达式给出,2n
则 number of0s
应等于 number 1s = n
。
如何找到数量相等的 1 和 0 的正则表达式。我也对您如何看待这种解决方案感兴趣?
例如:应该匹配:1100、00100111、01。不应该匹配:110、0、11001。
我需要正则表达式,它给出了所有这些字符串的集合。如果集合中的字符串长度由正则表达式给出,2n
则 number of0s
应等于 number 1s = n
。
无法为语言 L = (0,1)(相同数量的 1 和 0)生成正则表达式。这不是正则语言,所以不能用正则表达式来描述。这不是常规的,因为接受它的自动机将需要不同数量的内存,具体取决于输入的长度。常规语言是一种使用恒定内存的语言,无论输入的长度如何。您描述的语言可以由上下文无关语法生成,但不能由正则表达式生成。以下 CFG 生成字符串,其中 0 的数量和 1 的数量相等。如果 S 是语言中的任何单词:S -> SS;S -> 0S1;S -> 1S0; S -> e 空词 对于这种语言,您需要一个堆栈,并且可以设计一个下推自动机来接受它,或者一个图灵机。
常规语法(有限状态自动机)不可能:http ://en.wikipedia.org/wiki/Regular_language
这是满足您需求的 .NET 引擎的正则表达式模式。在ideone.com上查看它的实际应用。
^((?(D)(?!))(?<C>1)|(?(D)(?!))(?<-C>0)|(?(C)(?!))(?<D>0)|(?(C)(?!))(?<-D>1))*(?(C)(?!))(?(D)(?!))$
它通过使用两个堆栈来工作,如果当前的 1 多于 0,则使用一个 (C),如果零多于一,则使用另一个 (D)。
不漂亮,绝对不可用,但它有效。(哈!)
虽然这对于另一个答案中所述的常规语法是不可能的,但扫描字符串应该相对容易,为 each 递增一个计数器1
并为 each 递减它0
。如果最终计数为 0,则0
s 和1
s 的数量相等(模 2^wordsize - 注意溢出会使它有点棘手,但取决于是否可以对输入做出其他假设,即可能没有必要)。