九、正则表达式

1、概念

正则表达式是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。许多程序设计语言都支持利用正则表达式进行字符串操作。

正则表达式通常缩写成 regex 或 regexp。

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑

2、正则表达式示例

例1:
假设你在一篇英文小说里查找hi,你可以使用正则表达式hi。但这样,也会把比如him,history,high等等里面的hi找出来。所以如果要精确地查找hi这个单词的话,我们应该使用\bhi\b。
\b代表着单词的开头或结尾。

例2:
如果要查找一种电话号码,它以0开头,然后是3个数字,然后是一个连字号 - ,最后是7个数字,正则表达式为 0\d{3}-\d{7}。

例3:
\b\w{6}\b 匹配刚好6个字符的单词。

例4:
\d+匹配1个或更多连续的数字。

例5:
如果要填一个6-10***号,正则表达式为 ^\d{6,10}$。

例6:
匹配1-31天:0?[1-9]|[12][0-9]|3[01],1-12月:0?[1-9]|1[0-2],年份:19|20\d{2}。

例7:
匹配2种格式的电话号码 (0795)1234567 和 0795-1234567,(0\d{3})\d{7}|0\d{3}-\d{7}。

例8:
IP地址 ((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

例9:
网址URL ^(https?://)?([\w\d_-]+.)+\w{2,4}(/[\w\d.?-_%=&]+)*$

例10:
电子邮箱

        /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/
        /^([\w\d_\.-]+)@([\w\d_-]+\.)+\w{2,4}$/
        /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/
        /^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/

例11:
匹配空白行的正则表达式:^\s*\n 。注:可以用来删除空白行。

例12:
删除文字当中多余的换行 (\w)(\n)(\w) 替换为 \1\3;
给每一段前面加几个空格 (\n)(\w) 替换为 \1 \2。

例13:
匹配首尾空白字符的正则表达式:^\s|\s$ 。
注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等)。

例14:
日期,格式为 yyyy-m-d。
只做格式验证, 不做日期的有效性验证:\d{4}-\d{1,2}-\d{1,2};
做简单的验证:\d{4}-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[01])。

例15:日期正则表达式,从1900-2099年,
考虑了闰年,格式为 yyyy-m-d:

/^((((19|20)\d{2})-(0?[13-9]|1[012])-(0?[1-9]|[12]\d|30))|(((19|20)\d{2})-(0?[13578]|1[02])-31)|(((19|20)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))-0?2-29))$/

如果不考虑闰年,则:

/^((((19|20)\d{2})-(0?[13-9]|1[012])-(0?[1-9]|[12]\d|30))|(((19|20)\d{2})-(0?[13578]|1[02])-31)|(((19|20)\d{2})-0?2-(0?[1-9]|1\d|2[0-8])))$/

或(格式为yyyy-mm-dd):

^[0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))$

3、元字符

  • \d 查找数字。
  • \D 查找非数字字符。
  • \w 查找字母、数字、下划线或汉字。
  • \W 查找非字母、数字、下划线或汉字。
  • \s 查找空白字符。
    空白字符可以是:空格符、制表符、回车符、换行符、中文全角空格。
  • \S 查找非空白字符。
  • . 查找单个字符,除了换行和行结束符。
  • \b 查找位于单词的开头或结尾的匹配。
  • \B 查找不处在单词的开头或结尾的匹配。
  • \n 查找换行符。
  • \r 查找回车符。
  • \t 查找制表符。

4、量词

  • * 重复零次或更多次
  • + 重复一次或更多次
  • ? 重复零次或一次
  • {n} 重复n次
  • {n,} 重复n次或更多次
  • {n,m} 重复n到m次
  • ^ 行的开始
  • $ 行的结尾
  • ?= 表示其后紧接指定字符串。
  • ?! 表示其后没有紧接指定字符串。

5、方括号,用于查找某个范围内的字符

  • [abc] 查找方括号之间的任何字符。
  • [^abc] 查找任何不在方括号之间的字符。
  • [0-9] 查找任何从 0 至 9 的数字。
  • [a-z] 查找任何从小写 a 到小写 z 的字符。
  • [A-Z] 查找任何从大写 A 到大写 Z 的字符。
  • [A-z] 查找任何从大写 A 到小写 z 的字符。
  • [abcd] 查找给定集合内的任何字符。
  • [^abcd] 查找给定集合外的任何字符。

例:验证邮箱格式:

 //    var reg = new RegExp("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");  
var reg = /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;
 if (!reg.test("28989587.qq.com")) {
   alert("邮箱格式不对!");