首页 > 代码库 > 5分钟读懂正则表达式
5分钟读懂正则表达式
本文仅作针对不熟悉正则表达式的朋友,可以通过本文快速的“读”懂代码中令人不快的正则表达式,至于进一步熟练的写出正则表达式,请参考文章底部链接或阅读专业书籍。
如果你总感觉看书看不懂,建议阅读《如何阅读一本书》 ——题外话。
1. 正则表达式一般使用 / 和 / 包裹起来的。
2. 字面量字符(直接量字符)
/a/ 匹配字符a
/a1/ 匹配a1中任一个
/\./ 匹配除 \n 之外的任一字符
方括号
/[0-9]/ 匹配从字符0到字符9的任意一个字符
/[I can]/ 匹配 I,空格,c,a,n 任意一个字符
/[^I can]/ 匹配除了I,空格,c,a,n之外的任何一个字符
转义字符
/\s/ 空白字符
/\w/ 单词字符(英文单词)
/\d/ 数字
/\b/ 单词边界
/\S/ 非空白字符(和上面对应的大写)
/\W/ 非单词字符
/\D/ 非数字字符
/\B/ 非单词边界
作为正则表达式元字符的字符若需要作为字面量匹配时,加上反斜线转义
/\\/ 匹配字符 \
/\?/ 匹配字符 ?
3. 匹配多个字符
这时就需要*,+,?之类的字符来表示量的概念
+ 表示前面的字符可以重复 1次或多次
* 表示前面的字符可以重复 0次或多次
? 表示前面的字符可以重复 0次或1次
{n} 表示前面的字符可以重复n次
{n,m} 表示前面的字符可以重复n到m次
/[a-z]+/ 1个或多个 小写字母的字符串
/[a-z]*/ 0个或多个 小写字母的字符串
/[a-z]?/ 0个或 1个 小写字母的字符串
/[a-z]{5}/ 5个连续的小写字母字符串
/[a-z]{1,5}/ 1个到5个连续的小写字母字符串
/^n/ 以n开头的字符串
/n$/ 以n结尾的字符串
非贪婪的重复
上面的重复都是尽可能的匹配的,当需要最少匹配时,只需在待匹配的字符后跟随一个问号 ? 即可。
"aaa"
/a+/ 匹配三个a
/a+?/ 只匹配第一个 a
"aaab"
/a+b/ 匹配aaab
/a+?b/ 依然匹配aaab
4. 组合
很简单,就是用括号括起来。
([0-9])|(a-z) 数字或者小写字母的一个字符(注意是"一个"字符,因为我们没有加任何量词)
(\d{1,3}\.){3}\d{1,3} 简单的IP地址,但允许 888.888.888.888
解释:\d{1,3} 指1个或3个数字的字符串,如 "255"
\. 就是一个点号
((\d{1,3}\.){3}) 1或3个数字后面跟个点,这再重复3次,如 "192.10.234."
\d{1,3} 最后又是1个或3个数字的字符串
5. 判断和选取
这个有点小复杂,主要和圆括号()有关。
A. 纯圆括号()有2个作用:
1. 组合单项成为表达式,方便使用量词和“|”
2. 选取括号中匹配的值
/[a-z]+(\d+)/ 之后可在同一个表达式的后面使用 \1 来引用 (\d++) 内匹配的字符串
如:(注:为了阅读效果,在单双引号之间加了个空格!)
/[‘ "][^‘ "][‘ "]/ 匹配单引号或双引号中的0个或多个非引号字符
/[‘ "][^‘ "]\1/ 比上面严格,在上面的基础上,严格匹配左侧和右侧引号一致
B. (?:) 改进圆括号
只组合单项,方便使用量词和“|”,不记忆与该组匹配的字符,经常和"|"连用,形式如 (?:x|y)
industr(?:y|ies) industry|industries 匹配单词的单复数
6. 定位(断言)
(?=exp) 匹配exp前面的位置,不含自己
如:
\b\w+(?=ing\b) 匹配以ing结尾的单词(除了ing以外的部分)
I‘m singing while you‘re dancing. 它会匹配sing和danc
最后,举个JQuery源代码中的 trim 实现函数中的 正则表达式研究一下。
var whitespace = "[\\x20\\t\\r\\n\\f]", rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ); //.... trim: function( text ) { return text == null ? "" : ( text + "" ).replace( rtrim, "" ); },
合并之后,从字符串转变为正则表达式(各去掉一个反斜线!)
字符串 "^[\\x20\\t\\r\\n\\f]+|((?:^|[^\\\\])(?:\\\\.)*)[\\x20\\t\\r\\n\\f]+$"
正则表达式 /^[\x20\t\r\n\f]+|((?:^|[^\\])(?:\\.)*)[\x20\t\r\n\f]+$/g
细看会发现其实它是有两个部分组合的。一是:whitespace,一是 ((?:^|[^\\\\])(?:\\\\.)*)。其中whitespace就是空格符,制表符,回车符,换行符,翻页符。
下面细细说说后面这串表达式含义。
由简入繁:
/^[...]+ | ( (?: ) ( )* ) [...]+ $/g /^[...]+ | ( (?: ^ | [^\\] ) (?:\\.)* ) [...]+ $/g //(?:) 可同义替换为 () //[^\\] 除了\的任一字符 //(^|[^\\]) 开头没有字符 或 非\的字符 //(?:\\.)* 任一字符(不含\n换行符)重复0或多次 // | 后面意思就是 开头没有字符(即下个字符即为原始串的第一个字符)或是非\字符(此时才1位字符) // 和除了换行符的任意字符串 // 和一个whitespace,然后字符串结束 // //当然 | 前面无非就是匹配以 whitespace 开头而已
进一步学习:http://www.jb51.net/tools/zhengze.html
最后编辑时间:2014年5月27日 22:02