学习一个新的东西,需要先理顺来龙去脉。带着问题去学习比按部就班的去翻书要好很多。我也是刚刚接触正则表达式,我将把我学习过程中的笔记和一些思路记录下来。并不是很深奥的东西,只是一些总结而已。

  • 需求:

由于一个项目中,发送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


Regex expression 基础

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名metaboy(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

相关文章:

  • 2021-08-01
  • 2022-01-12
  • 2021-10-03
  • 2021-05-09
  • 2021-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-05-19
  • 2022-12-23
  • 2021-11-22
  • 2021-07-10
  • 2021-07-26
  • 2021-07-23
  • 2021-07-21
相关资源
相似解决方案