学习一个新的东西,需要先理顺来龙去脉。带着问题去学习比按部就班的去翻书要好很多。我也是刚刚接触正则表达式,我将把我学习过程中的笔记和一些思路记录下来。并不是很深奥的东西,只是一些总结而已。
-
需求:
由于一个项目中,发送request从服务器获取网页的基本信息,并对该html文档进行字符信息的提前。所有,需要用到正则表达式。鉴于我们项目采用的是C#语言,所有就直接使用.Net 所带有的引擎去分析。
-
测试工具:
由于正则表达式异常的难读,常人不可能靠双眼就能知道它的正确性,所有我需要有一个测试工具方便编写正则表达式。
我推荐2款工具,一个简单好用的RegexTester,它是基于微软.Net Framework下的工具,与我的项目比较匹配。
下载地址 : https://files.cnblogs.com/metaboy/RegexTester.zip
另外一款工具比较强大,Expresso,它是一款收费的软件, 如果需要基于其他引擎的朋友可以考虑试用这个工具。
下载地址: http://www.ultrapico.com/ExpressoDownload.htm
-
基本常识:
我定义为基本常识的内容就是常用的功能,正则表达式的功能非常强大,一个人通过短暂的学习不可能面面俱到,所有我觉得目前我所了解的可能只是一些很基本的功能。
1. 元字符(metacharacters)
完整的正则表达式由2种字符构成,一种是元字符,一种是普通的文本字符。由此可见,元字符是何其的重要。废话不多说了,我总结了常见的一些元字符的使用说明。
| 表达式/语法 | 说明 |
| . | 小数点可以匹配除了换行符(\n)以外的任意一个字符 |
| \w | 任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个 |
| \s | 包括空格、制表符、换页符等空白字符的其中任意一个 |
| \d | 任意一个数字,0~9 中的任意一个 |
| \b | 匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符 |
| ^ | 与字符串开始的地方匹配,不匹配任何字符 |
| $ | 与字符串结束的地方匹配,不匹配任何字符 |
2. 转义字符有两种情况:
1. “\” + 一些特殊字符,比如^,$…,代表的就是字符本身。
2. 一些不便输出的字符,回车,换行,制表符等。分别用 \n,\r,\t 表示。
3. 修饰匹配次数
上面提到的都是匹配一个字符,如果要匹配多个字符,就需要用到修饰次数的元字符| 表达式 | 说明 | 示例 |
| {n} | 表达式重复n次 | 比如:"\w{2}" 相当于 "\w\w" |
| {m,n} | 表达式至少重复m次,最多重复n次 | 比如:"ba{1,3}"可以匹配 "ba"或"baa"或"baaa" |
| {m,} | 表达式至少重复m次 | "\w\d{2,}"可以匹配 "a12","_456","M12344"... |
| ? | 匹配表达式0次或者1次,相当于 {0,1} | 比如:"a[cd]?"可以匹配 "a","ac","ad" |
| + | 表达式至少出现1次,相当于 {1,} | 比如:"a+b"可以匹配 "ab","aab","aaab"... |
| * | 表达式不出现或出现任意次,相当于 {0,} | 比如:"\^*b"可以匹配 "b","^^^b"... |
4. 字符组
如果你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),使用[ aeiou].
比如说[0-9] 也就是代表可以是从0-9中的任何一个数字,与"\d" 同义。
同理,[a-z0-9A-Z] 也应该与"\w "同义。
5. 分组
一些符号可以影响表达式内部的子表达式之间的关系:
| 表达式 | 说明 | 示例 |
| | | 左右两边表达式之间 "或" 关系,匹配左边或者右边 | gr(a|e)y 可以匹配gray,grey |
| ( ) | (1). 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰 (2). 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到 | (abd){2} 可以匹配 abdabd |
6. 匹配规则
a. 通用规则:优先级最高的规则,最先开始的匹配拥有最高的优先权.可以参考懒惰匹配的例子,匹配的第一个是aab
匹配的第一个是aab,而不是ab,就可以解释这个规则。(The match that begins earliest wins)
b. 贪婪匹配: 匹配尽可能多的字符. 通常的限定符都是基础贪婪匹配的模式。
c. 懒惰匹配: 也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个 问号?
| 表达式 | 说明 | 示例 |
| a.*b | 它将会匹配最长的以a开始,以b结束的字符串 | 匹配文本 :aabab 匹配结果 :aabab |
| a.*?b | 它将匹配最短的,以a开始,以b结束的字符串 | 匹配文本 :aabab 匹配结果 :aab(1-3字符) , ab(4-5字符) |
-
推荐学习站点:
1. Presenting a test bed for .NET Regular Expressions: http://www.codeproject.com/KB/string/RegexTester_.aspx
2. 正则表达式参考文档: http://www.regexlab.com/zh/regref.htm
3. 正则表达式30分钟入门: http://deerchao.net/tutorials/regex/regex.htm
本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名metaboy(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言。