Regex 相等数量的0和1的正则表达式

Regex 相等数量的0和1的正则表达式,regex,Regex,如何找到数量等于1和0的正则表达式。 我也很感兴趣的是你如何看待这样的解决方案 例如: 应匹配:1100、00111、01。 不应该匹配:110,0,11001 我需要正则表达式,它给出了所有这些字符串的集合。 如果集合中的字符串长度由2n中的正则表达式给出,则0s的数目应等于number1s=n对于正则语法(有限状态自动机)是不可能的:而对于另一个答案中所述的正则语法,这是不可能的,扫描字符串应该相对容易,为每个1递增一个计数器,为每个0递减一个计数器。如果最终计数为0,则0s和1s的数量相等

如何找到数量等于1和0的正则表达式。 我也很感兴趣的是你如何看待这样的解决方案

例如: 应匹配:1100、00111、01。 不应该匹配:110,0,11001

我需要正则表达式,它给出了所有这些字符串的集合。
如果集合中的字符串长度由
2n
中的正则表达式给出,则
0s
的数目应等于number
1s=n
对于正则语法(有限状态自动机)是不可能的:

而对于另一个答案中所述的正则语法,这是不可能的,扫描字符串应该相对容易,为每个
1
递增一个计数器,为每个
0
递减一个计数器。如果最终计数为0,则
0
s和
1
s的数量相等(模2^字号-注意溢出会使它变得更棘手,但取决于是否有其他关于输入的假设,这可能不是必需的).

下面是一个用于.NET引擎的正则表达式模式,它确实满足了您的需求。看看它在行动

((?(D)(?!)(?!)(?(1)(?(D)(?!)(?)(?)0)(?(C)(?!)(?0)(?(C)(?!)(?1))*(?(C)(?!)(?(D)(?!)$ 它通过使用两个堆栈来工作,如果当前的1多于0,则使用一个堆栈(C),如果0多于1,则使用另一个堆栈(D)


不漂亮,肯定不可用,但它可以工作。(Ha!)

不可能为语言L=(0,1)(相同数量的1和0)生成正则表达式。这不是一种正则语言,因此不能用正则表达式来描述。它不是规则的,因为接受它的自动机需要不同的内存量,这取决于输入的长度。常规语言是一种使用恒定内存的语言,无论输入的长度如何。您描述的语言可以由上下文无关语法生成,但不能由正则表达式生成。 下面的CFG生成0和1数量相等的字符串。如果S是语言中的任何单词: S->SS;S->0S1;S->1S0;S->e空单词
对于这种语言,您需要一个堆栈,可以设计一个下推自动机来接受它,或者设计一个图灵机。

不清楚您要匹配什么。请提供应该匹配的字符串和不应该匹配的字符串的示例。此外,请说明您使用的语言,或者您是否在谈论计算机科学意义上的正则表达式。正则表达式不会“给出所有此类字符串的集合”。它们定义了一种模式。如果需要生成所有可能的匹配字符串,那么这不是正则表达式的工作。此外,如果是某种作业,请将
[家庭作业]
标记改为
[考试]
,并为您使用的编程语言添加标记。你可以通过点击链接来完成。我听说
[家庭作业]
标签现在也被淘汰了@LevLevitsky是一个计算机理论正则表达式,它定义了一个集合。正则表达式只是定义与其匹配的字符串集的一种简捷方法。这是一种肮脏的攻击。我向你脱帽致敬,先生,这个游戏的运行时间一定很糟糕。谢谢!=)我很自豪从来没有用过这个。。事情在生产代码中。但在运行时,它应该是ok的,O(n)表示字符串长度n,因为它不会做很多回溯。我见过更糟糕的正则表达式。
^((?(D)(?!))(?<C>1)|(?(D)(?!))(?<-C>0)|(?(C)(?!))(?<D>0)|(?(C)(?!))(?<-D>1))*(?(C)(?!))(?(D)(?!))$