正则表达式是什么?
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。(http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm)
正则表达式是一种语言,它可以明确描述文本字符串中的模式。(http://www.microsoft.com/china/msdn/library/webservices/asp.net/regexnet.mspx?pf=true)
正则表达式的规则?
非显式限定符:限定符(限定符始终引用限定符左边的模式,通常是单个字符,除非使用括号创建模式组。)
1. | *,描述“出现 0 或多次”。 |
2. | +,描述“出现 1 或多次”。 |
3. | ?,描述“出现 0 或 1 次”。 |
显式限定符:显式限定符位于所应用的模式的后边,这一点与非显式限定符一样.如{}
元字符
代码 | 说明 | ||
---|---|---|---|
. | 匹配除换行符以外的任意字符 | ||
/w | 匹配字母或数字或下划线或汉字 | ||
/s | 匹配任意的空白符 | ||
/d | 匹配数字 | ||
/b | 匹配单词的开始或结束 | ||
^ | 匹配字符串的开始 | ||
$ | 匹配字符串的结束 | ||
| | 交替指定(a|b 将匹配包含“a”或“b”的任何输入内容) | ||
( ) | 模式分组
|
字符类:在方括号 [ ] 中定义
such as:
模式 | 输入(匹配) |
^b[aeiou]t$ | Bat、bet、bit、bot、but |
^[0-9]{5}$ | 11111, 12345, 99999 |
^c:// | c:/windows、c://///、c:/foo.txt、c:/ 后跟任何其他内容 |
abc$ | abc、123abc、以 abc 结束的任意字符串 |
(abc){2,3} | abcabc、abcabcabc |
^[^-][0-9]$ | 0、1、2、... (不匹配 -0、-1、 -2 等) |
预定义的集合元字符:一切为了简变
元字符 | 等效字符类 |
/a | 匹配铃声(警报);/u0007 |
/b | 匹配字符类外的字边界,它匹配退格字符,/u0008 |
/t | 匹配制表符,/u0009 |
/r | 匹配回车符,/u000D |
/w | 匹配垂直制表符,/u000B |
/f | 匹配换页符,/u000C |
/n | 匹配新行,/u000A |
/e | 匹配转义符,/u001B |
/040 | 匹配 3 位 8 进制 ASCII 字符。/040 表示空格(十进制数 32)。 |
/x20 | 使用 2 位 16 进制数匹配 ASCII 字符。此例中,/x2- 表示空格。 |
/cC | 匹配 ASCII 控制字符,此例中是 ctrl-C。 |
/u0020 | 使用 4 位 16 进制数匹配 Unicode 字符。此例中 /u0020 是空格。 |
/* | 不代表预定义字符类的任意字符都只作为该字符本身对待。因此,/* 等同于 /x2A(是文字 *,不是 * 元字符)。 |
/p{name} | 匹配已命名字符类“name”中的任意字符。支持名称是 Unicode 组和块范围。例如,Ll、Nd、Z、IsGreek、IsBoxDrawing 和 Sc(货币)。 |
/p{name} | 匹配已命名字符类“name”中不包括的文本。 |
/w | 匹配任意单词字符。对于非 Unicode 和 ECMAScript 实现,这等同于 [a-zA-Z_0-9]。在 Unicode 类别中,这等同于 [/p{Ll}/p{Lu}/p{Lt}/p{Lo}/p{Nd}/p{Pc}]。 |
/W | /w 的否定,等效于 ECMAScript 兼容集合 [^a-zA-Z_0-9] 或 Unicode 字符类别 [^/p{Ll}/p{Lu}/p{Lt}/p{Lo}/p{Nd}/p{Pc}]。 |
/s | 匹配任意空白区域字符。等效于 Unicode 字符类 [/f/n/r/t/v/x85/p{Z}]。如果使用 ECMAScript 选项指定 ECMAScript 兼容方式,/s 等效于 [ /f/n/r/t/v] (请注意前导空格)。 |
/S | 匹配任意非空白区域字符。等效于 Unicode 字符类别 [^/f/n/r/t/v/x85/p{Z}]。如果使用 ECMAScript 选项指定 ECMAScript 兼容方式,/S 等效于 [^ /f/n/r/t/v] (请注意 ^ 后的空格)。 |
/d | 匹配任意十进制数字。在 ECMAScript 方式下,等效于 Unicode 的 [/p{Nd}]、非 Unicode 的 [0-9]。 |
/D | 匹配任意非十进制数字。在 ECMAScript 方式下,等效于 Unicode 的 [/p{Nd}]、非 Unicode 的 [^0-9]。 |
怎么用正则表达式?
请访问以下地址中的正则表达式联机数据库:http://www.regexlib.com/。
模式 | 说明 |
^/d{5}$ | 5 个数值数字,如美国邮政编码。 |
^(/d{5})|(/d{5}-/d{4}$ | 5 个数值数字或 5 个数字-短划线-4 个数字。匹配 5 位数字格式的美国邮政编码,或 5 位数字 + 4 位数字格式的美国邮政编码。 |
^(/d{5}(-/d{4})?$ | 与前一个相同,但更有效。使用 ? 可使模式中的 4 位数字成为可选部分,而不是要求分别比较不同的两个模式(通过另一种方式)。 |
^[+-]?/d+(/./d+)?$ | 匹配任意有可选符号的实数。 |
^[+-]?/d*/.?/d*$ | 与上一个相同,但也匹配空字符串。 |
^(20|21|22|23|[01]/d)[0-5]/d$ | 匹配 24 小时制时间值。 |
//*.*/*/ | 匹配 C 语言风格的注释 /* ... */ |
asp.net 中的使用?
private void ValidateZipButton_Click(object sender, System.EventArgs e) { String ZipRegex = @"^/d{5}___FCKpd___0quot;; if(Regex.IsMatch(ZipTextBox.Text, ZipRegex)) { ResultLabel.Text = "ZIP is valid!"; } else { ResultLabel.Text = "ZIP is invalid!"; } }
类似的,可以使用静态 Replace() 方法将匹配替换为特定字符串,如下所示:
String newText = Regex.Replace(inputString, pattern, replacementText);
最后,可以使用如下代码遍历输入字符串的匹配集合:
private void MatchButton_Click(object sender, System.EventArgs e) { MatchCollection matches = Regex.Matches(SearchStringTextBox.Text, MatchExpressionTextBox.Text); MatchCountLabel.Text = matches.Count.ToString(); MatchesLabel.Text = ""; foreach(Match match in matches) { MatchesLabel.Text += "Found" + match.ToString() + " at position " + match.Index + ".<br>"; } }
参考:
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/jscript7/html/jsreconintroductiontoregularexpressions.asp
http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm(更深内容)