正则表达式
if (!Regex.IsMatch(pwd,"^[a-zA-Z0-9]{6,20}$")) { Response.Write("<scriptlanguage='JavaScript'>alert(' 长度必须大于6个字符小于20个字符,只能为英语字、数字,例如:snsn2003等')</script>"); return; } function IP2V(ip) { re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正则表达式 if(re.test(ip)) { return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1 } else { throw new Error("Not a valid IP address!") } }
名字空间简介 在名字空间中仅仅包含着6个类和一个定义,它们是: Regex类中还包含一些静态的方法: Escape: 对字符串中的regex中的转义符进行转义;
Match m =Regex.Match("abracadabra","(a|b|r)+"); 字符串的替换
strings = Regex.Replace("abracadabra","abra","zzzz"); 匹配引擎的细节
string text = "abracadabra1abracadabra2abracadabra3"; string pat = @"(abracadabra)"; /*@"(#第一个组的开始 abra#匹配字符串abra (#第二个组的开始 cad#匹配字符串cad)?#第二个组结束(可选))#第一个组结束+#匹配一次或多次";*/ //利用x修饰符忽略注释 Regex r = new Regex(pat,RegexOptions.None); //new Regex(pat,"x"); //获得组号码的清单int[] gnums = r.GetGroupNumbers(); //首次匹配 Match m = r.Match(text); #region { int u = 0; bool RegexSuccess = false; if (RegexSuccess=m.Success) { Response.Write("<center>"); } while (m.Success) { //从组1开始 for (int i = 1; i < gnums.Length; i++) { Group g = m.Groups[i]; //获得这次匹配的组 Response.Write("Group" + (u+1) +":Index"+m.Index); //计算这个组的起始位置和长度 CaptureCollection cc = g.Captures; for (int j = 0; j < cc.Count; j++) { Capture c = cc[j]; Response.Write(" Capture" + j + "=[" + c.ToString() + "] Length=" + c.Length); } } //下一个匹配 m = m.NextMatch(); u++; Response.Write("<br/>"); } if (RegexSuccess) { Response.Write("</center>"); } } // foreach (Match m in Regex.Matches(text,pattern)) { } #endregion Server.Transfer("~/WebForm2.aspx"); Response.End(); 中文^([u4e00-u9fa5]+|[a-zA-Z0-9]+)$
比如一个网站如果要求你填写的QQ号必须为5位到12位数字时,可以使用:^d{5,12}$。这里的{5,12}和前面介绍过的{2}是类似的,只不过{2}匹配只能不多不少重复2次,{5,12}则是重复的次数不能少于5次,不能多于12次,否则都不匹配。因为使用了^和$,所以输入的整个字符串都要用来和d{5,12}来匹配.
像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!) 像[0-9]代表的含意与d就是完全一致的:一位数字,同理[a-z0-9A-Z_]也完全等同于w(如果只考虑英文的话)。
|(替换) 0d{2}-d{8}|0d{3}-d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。 分组 (d{1,3}.){3}d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:d{1,3}匹配1到3位的数字,(d{1,3}.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(d{1,3})。 不幸的是,它也将匹配256.300.888.999这种不可能存在的IP地址(IP地址中每个数字都不能大于255。题外话,好像反恐24小时第三季的编剧不知道这一点,汗...)。如果能使用算术比较的话,或许能简单地解决这个问题,但是正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择,字符类来描述一个正确的IP地址:((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)。 理解这个表达式的关键是理解2[0-4]d|25[0-5]|[01]?dd?,这里我就不细说了,你自己应该能分析得出来它的意义。 后向引用 b(w+)bs+1b可以用来匹配重复的单词,像go go,kitty kitty。 b(?<Word>w+)bs+k<Word>b。
零宽断言 (?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如bw+(?=ingb),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。 (?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=bre)w+b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading abook时,它匹配ading。 负向零宽断言 零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式exp。例如:d{3}(?!d)匹配三位数字,而且这三位数字的后面不能是数字;b((?!abc)w)+b匹配不包含连续字符串abc的单词。 同理,我们可以用(?<!exp),零宽度正回顾后发断言来断言此位置的前面不能匹配表达式exp:(?<![a-z])d{7}匹配前面不是小写字母的七位数字。 注释 在#后面到这一行结束的所有文本都将被当成注释忽略掉。 (?<= # 断言要匹配的文本的前缀 <(w+)> # 查找尖括号括起来的字母或数字(即HTML/XML标签) )# 前缀结束 贪婪与懒惰
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。 有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。 a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab和ab
|