正则表达式匹配排列

来源:互联网 发布:淘宝买家秀 百度云盘 编辑:程序博客网 时间:2024/06/04 18:13

前几天有位同事问到这方面的问题,当前首先想到的是用平衡组,不过平衡组的例了主要用于匹配嵌套的Html标签,在网上查了一下,也没这方面的资料,不过这个问题最终还是通过平衡组解决了

先来看全排列了,假如有元素A,B,C,由这三个元素组成的组成的全排列为ABC,ACB,BAC,BCA,CAB,CBA六种,显然用[A-C]{3}这样的正则表达式是不对的,因为这样会匹配像AAA, ABB这样的排列,当然你可以通过或运算符将所有的排列列出来,正则表达式如下(ABC|ACB|BAC|BCA|CAB|CBA),这是没有问题的,但是如果有4个元素,就有24排列,如果有5个元素,有120种排列,用这种方法就不太现实了,如果改用平衡组来实现,就简单多了,对A,B,C三个元素,正则表达式如下:

(?'A')(?'B')(?'C')((?'-A'A)|(?'-B'B)|(?'-C'C)){3}(?(A)(?!))(?(B)(?!))(?(C)(?!))

首先往栈中放入三个名称为A, B, C的三个分组,注意由于这三个分组不匹配任何内容

接着当匹配元素A时,将名称为A的分组从栈中移除,当匹配元素B是,将名称为B的分组从栈中移除,当匹配元素C时,将名称为C的分组从栈中移除,{3}指定只匹配3个元素

最后检查栈中是否还有名称为A,B,C的分组,如果有,则匹配失败。

OK,全排列搞定了,下面来看部分排列了,假如有A,B,C,D四个元素,取两个元素的排列为AB,AC,AD,BD,BA,BC,BD,CA,CB,CD,DA,DB,DC,共是12种,当然用或运算符讲12种情况列出来是没问题,正则表在式就不写了,如果取三个元素呢,就有24种情况了,显然通过这种方式不够灵活了,通过平衡组,这个问题一样可以解决,正则表达式如下:

(?'item'){2}(?'-item'[A-D]){2}(?(item)(?!))

先往栈中压入2个名为item的分组,这两个分组不匹配如何元素

接着当匹配到A,B,C,D中的任何一个元素,从栈中移除一个item分组,{2}保证只匹配两个元素

最后检查栈中是否还有item分组,有则匹配失败

C#的测试代码如下:

原创粉丝点击