发新话题
打印

[转载]精通正则表达式小结

[转载]精通正则表达式小结

信息来源:邪恶八进制信息安全团队(www.eviloctal.com


1.^符号在方括号[]外面的时候代表“开头”,比如^a的意思就是以a开头,而当^符号在方括号内的时候就代表“排除”,比如[^a]的意思是所有不是a的字符。

2.正则中的量词,问号?,加号+,星号*。?号的意思是出现一次或者零次,*号是随便出现几次,当然也可以不出现,+号的意思是至少出现一次,当然也可以出现无数次。总结一下:
+:至少还有你
?:要么有要么没
*:可有可无
3.方括号内部

代表一个字符组[a-z]代表小写字母从a到z,[1,3]代表字符‘1’字符‘,’以及字符‘3’,逗号也是字符哦。[()]这个字符组也是正确的,代表左括号和右括号。有个要注意的就是[^ab]不是代表所有非ab的字符,而是代表所有非a的字符以及字符b,其实等价于[^a],如果要把连字符(-)也加到字符组里面,那么要放第一个比如[-A-Z]

4.\s在很多流派里面都代表空白,包括tab,空格,换行,回车这类的。其他的还有:
\t:tab
\n:换行
\r:回车
\S:除了\s以外所有的字符(所以\s\S就是统统统统的有了)
\w:[a-zA-Z0-9]
\W:\w以外所有的字符
\d:0-9数字
\D:除了\d以外的字符
5.修饰符:i是忽略大小写

6.一般用括号括起来的部分会被获取,然后可以用\1,\2这样的来引用(经常在urlrewrite里面看到吧)


几个概念及理解:
1、正则表达式是强大,便捷,高效的文本处理工具。
2、利用正则表达式能够添加、删除、分离、插入和修整各种类型的文本和数据。
3、要学会用正则表示达式来思考。
4、完整的正则表达式由两种字符构成:特殊字符(元字符),文字(普通文本字符)。
5、元字符的描述能力是正则表达式的核心。
6、元字符相当于人类语言的语法。
^(From|Subject): 其中 ^ , ( , | , ) 都是元字符。

正则表达式的思维框架
完整的正则表达式由小的的构建模块单元组成,每个单元都很简单,但他们能够以无穷多种组合。

1)行的起始和结束
^:行的开始
$:行的结束

他们匹配的是一个位置而不是具体的文本。

2)字符组
1、匹配若干字符之一:

正则表达式结构体:容许使用者列出在某处期望匹配的字符,通常被称作字符组。

[ea]:匹配e或者a

gr[ea]y:匹配时先找到g,接着是r,然后是一个a或者e,最后是一个y

重要:字符组的意思就是“或”,在字符组内部“-”(连字符)表示一个范围

如:H[1-6]等同于H[123456]

[0-9a-fA-F] 等同于 [0123456789abcdefABCDEF] 也等同于 [A-Fa-f0-9] 也等同于 [a-f0-9A-F] 也等同于 [a-fA-F0-9],这叫多重组和。

[0-9A-Z_!.?] 匹配一个数字,大写字母,下划线,叹号,点号,问号

重要:只有在字符组内“-”(连字符)才是“元字符”,否则只能匹配普通的连字符,但并不意味着在字符组内一定就是元字符,如果出现在开头只表示普通连字符。问号(?)和点号(.)通常是元字符,但在字符组内他们都是普通字符了。
2、排除型字符组:
在字符组中出现^表示排除,列出的是不希望匹配的字符。
[^1-6] 匹配除1到6字外的任何字符,注意是任何字符!

重要:^在字符组外表是一个行的开始(锚点),在字符组内(且紧接在字符组的第一个方括号([) 之后)表示排除。

匹配未列出的字符 不等于 不要匹配列出的字符

3、用点号匹配任意字符:
元字符(.)是用来匹配任意字符的字符组的简便写法。
03[-./]19[-./]76 匹配:03/19/76 , 03-19-76 , 03.19.76 ,192033197639 ,但可能192033197639不是我们期望的结果,这是就要在对目标的了解程度和精准之间找一个平衡。

3)多选结构
1)匹配任意子表达式
关键要理解子表达式中的“子”,子表达式用“|”分割开,表示“或”,每个子表达式称作“多选分支”。
括号()对于子表达式是必须的,本身就是元字符。
格式:(子表达式1|子表达式2|子表达式3| ...)
例子:(First|1st)==(Fir|1)st
Jeffrey|Jeffery == Jeff(er|re)y == Jeff(ery|rey)

注意:多选结构与字符组是有根本的区别的,字符组只能由普通单字符构成分支,而多选结构的分支是可以由任何完整的表达式构成的,可以匹配任意长度的文本。

重要提示:在包含多选结构的表达式中使用^和$要格外小心,比较:
^From|Subject|Date: 和 ^(From|Subject|Date):
两者匹配的结果完全不同,前者会匹配:^From或者Subject或者Date:显然不是我们要的结果,所以有必要使用括号来进行限定。

忽略大小写如果单纯用正则表达式实现对大小写敏感或忽略的匹配模式是完全可以实现的。但对于通常的问题解决来说未免太麻烦了。目前很多工具软件都提供相关功能设定。也就是说是否忽略大小写的功能完全没有必要成为正则表达式的语言的一部分。
使用各种语言或工具中使用参数 i  就表示忽略大小写的匹配,否则就是对大小写敏感的匹配。
如在Javascript中可以这样设定:var myReg=/[.][0-9a-z]+$/i; 该表达式将可用来匹配文件名的扩展名,如:.mp3, .doc , .html等,如果不使用i做忽略大小写的设定,必须改为:var myReg=/[.][0-9a-zA-Z]+$/i;

单词分界符顾名思义就是单词的起始点和结束点,目的就是防止匹配的目标出现在另外一个单词内。
\< 开始分界符
\> 结束分界符
例子:想在目标文本中查找cat,如果用表达式 cat来匹配能够找到所有的cat,但是也会找到不是预期的结果,如category等。利用单词分界符可以很好地解决这个问题。\<cat\>该表达式只匹配cat,如果想匹配以cat开头或结尾的单词可以这样:\<cat 匹配开头为cat的单词,cat\>匹配结尾为cat的单词。
注意:单词分界符并不是智能到认识英语单词,而只是限定一个连续的字符串而已。可惜并不是所有的工具或语言都支持单词分界符。   
小结一下:
目前所涉及到的元字符:
.   任意单个字符
[...] 列出的任意字符
[^...] 未列出的任意字符
^ 行的开始位置
$ 行的结束位置
\< 单词的开始位置
\> 单词的结束位置
| 匹配分隔两边的任意表达式
(...) 限制竖线(|)的作用范围  

可选项元素颜色在英语中有两种写法:color,colour 如果想把他们全部从目标文本中找出来可使用表达式:(color|colour) 或者 col(o|ou)r 或者 colo(ur|r) 等等。
现在我们多了一种选择??利用元字符(?)也能解决这个问题,而且更直接简便。
colou?r
u?表示此处可以出现u也可以不出现,两种情况都是匹配的预期结果。
所以元字符(?)代表可选项,只作用于前面紧邻的元素,注意:这里说的是元素,而没说是字符,当然目前的例子是匹配字符,字符当然是元素,所以推而广之?之前可以紧邻的元素也应该包括表达式,这恰恰是可选元素的强大功能所在。
如果?要作用于表达式,则该表达式必须用()限定成为一个元素,如:July?(fourth|4(th)?) 匹配七月四日可能被写成的格式:
July 4
Jul 4
July fourth
Jul fourth
Jul 4th
July 4th

其他量词:重复出现+ (加号)和 * (星号)的作用与问号类似。他们都对前面近邻的元素进行数量上的限定。
? 表示可有可无,但如果有数量必须是一个
+ 表示至少有一个以上
* 表示从无到有到多个没有任何数量限定
{min,max} 区间量词,规定重现次数的范围
隼选择比鹰更广阔的天空翱翔,也注定会更孤单。

TOP

发新话题