首页 > 代码库 > 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