前几天有位同事问到这方面的问题,当前首先想到的是用平衡组,不过平衡组的例了主要用于匹配嵌套的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#的测试代码如下: string input = "AB"; //string input = "AA"; string pattern = @"(?'item'){2}(?'-item'[A-D]){2}(?(item)(?!))"; Match match = Regex.Match(input, pattern); if (match.Success) { Console.WriteLine(match.Value); }
分享到:
相关推荐
其他的正则表达式匹配.php 其他的正则表达式匹配 取得正则表达式的全部匹配.php 取得正则表达式的全部匹配 返回与模式匹配的数组单元.php 返回与模式...
当你需要定位匹配某种模式的字符串时就可以使用正则表达式。例如,我们下面的一个例程就是在一个HTML文件中通过查找字符串模式来定位所有的超链接。 当然,为了指定一种模式,使用...这种记号是不够精确的。你需要...
正则表达式是一种描述字符串排列的一种语法规则,通过该规则可以在一个大字符串中匹配出满足规则的子字符串。简单来说,就是给定了一个字符串,在字符串中找到想要的字符串,如一个电话号码,一个IP地址,一个字段,...
当你需要定位匹配某种模式的字符串时就可以使用正则表达式。例如,我们下面的一个例程就是在一个HTML文件中通过查找字符串模式来定位所有的超链接。 当然,为了指定一种模式,使用...这种记号是不够精确的。你需要...
功能:$1-$9存放着正则表达式中最近的9个正则表达式的... [removed] //创建要进行匹配的字符串 var objStr=”这是我的手机号13100000000″ //创建正则表达式匹配手机号码 var re=/(13)(/d)(/d{8})/;//该正则表达式可
正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。 二、正则表达式与通配符 1. 正则表达式 用来在文件中匹配符合条件的字符串,正则表达式是“包含匹
正则表达式是用于描述字符排列和匹配模式的一种语法规则。 二、基本正则表达式语法 正则表达式主要用于字符串的模式分割、匹配、查找及替换操作,下面来关注一下正则表达式基本的元字符和它的作用。 正则表达式的...
正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。 1. 用途:匹配、查找、替换、分割 2. php提供了两套正则表达式函数库 *1. Per
正则表达式:用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。
我们知道,在正则表达式下(x) 表示匹配’x’并记录匹配的值。这只是比较通俗的说法,甚至说这是不严谨的说法,只有()捕获组形式才会记录匹配的值。非捕获组则只匹配,不记录。 捕获组: (pattern) 这种形式...
* Summary of regular-expression constructs 正则表达式结构简介: * Construct Matches * Characters 字符: * x The character x x 字符 x * \\ The ...
正则表达式 [Jj]ava.+ 匹配下列形式的任何字符串: 首字母是J或j 后续的三个字母是ava 字符串的剩余部分由一个或多个任意字符组成 例如,字符串“javaness”匹配这个特殊的正则表达式,但是字符串“Core Java”...
用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。 PHP中的正则函数: PHP中有两套正则函数,两者功能差不多,分别为: 一套是由PCRE(Perl Compatible Regular
在正则表达式中 . (点)表示除换行符以外的任意字符(在加上m参数打开多行匹配模式时表示任意字符),用转义符号\.表示点这个字符本体。 代码如下:var Pattern3=/<(.)+>/i; alert(Pattern3.exec(
正则表达式:用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。
软件介绍 1、初识正则表达式 ^([a-zA-Z0-9_-]) @([a-zA-Z0-9_-]) (\.[a-zA-Z0-9_-]) 用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。 2、正则表达式函数 ...
1、初识正则表达式 ^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+ 用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。2、正则表达式函数 ereg() eregi() ...
什么是正则表达式: 正则表达式用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分隔、匹配、查找及替换操作 元字符 * 重复匹配前一个字符0到多次 . 匹配除了换行符外任意一个字符,类似...
定义正则表达式匹配的字符串集; 其他语言。 第 4 课:通过搜索处理复杂性 搜索:用手电筒或船找路; 浇水。 分析算法的效率; 复发关系; 用算法匹配数据类型。 第 5 课:通过概率处理不确定性 概率:猪的游戏;...