1. 正则表达式
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串。
1.1 正则表达式符号
1.1.1 符号类
通用的符号:
符号 含义 范例 . 任意字符 “A”, “ ”(空格), “囧”, “1” d 匹配一个数字字符。等价于[0-9] “1”, “2”, “3” D 匹配一个非数字字符。等价于[^0-9] “a”, “b”, “c” w 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]” “Y”, “x”, “_”, “9” W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]” “ ”(空格) s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ fnrtv] “ ”(空格), “r”, “t”, “n” S 匹配任何非空白字符。等价于[^fnrtv] “B”, “囧”, “5” 特殊的符号:
符号 含义 范例 r 匹配一个回车符。等价于x0d和cM f 匹配一个换页符。等价于x0c和cL n 匹配一个换行符。等价于x0a和cJ t 匹配一个制表符。等价于x09和cI \\ 匹配 “” xhh 以ASCII码进⾏匹配 x41可以匹配”A” uhhhh 以UNICODE码进⾏匹配 u4e00-u9fa5 中⽂的范围 重点:关于
.
单行模式下(
gs
):能匹配\n
多行模式下(gm
):不能匹配\n
1.1.2 字符集合
符号 含义 [a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符 [abc] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a” [^xyz] 负值字符集合。匹配未包含的任意字符。例如,“1”可以匹配“plain”中的“p” [^a-c] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“2”可以匹配任何不在“a”到“z”范围内的任意字符 [\-] 匹配 “-” 1.1.3 字符边界
符号 含义 ^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“n”或“r”之后的位置 & 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“n”或“r”之前的位置 \b 匹配一个单词边界,也就是指单词和空格间的位置。例如,“erb”可以匹配“never”中的“er”,但不能匹配“verb”中的“er” \B 匹配非单词边界。“erB”能匹配“verb”中的“er”,但不能匹配“never”中的“er” 1.1.4 数量界定符
符号 定义 x{n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o x{n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*” x{n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格 x* 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,} x+ 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,} x? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1} 重点:关于
?
贪婪模式下:数量限定符都是在满⾜条件下尽可能的匹配更多的字符
非贪婪模式下:如果希望在满⾜条件下尽可能少的匹配字符, 在数量限定符后⾯加上“?”1.1.5 分支条件
符号 定义 x\ y 匹配x或y。例如,“z\ food”能匹配“z”或“food”。“(z\ f)ood”则匹配“zood”或“food”。 1.1.6 分组与后向引⽤
符号 定义 (x) 匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“(”或“)” 1..n 引⽤第1-n组匹配 (?:x) 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“( )”来组合一个模式的各个部分是很有用。例如“industr(?:y ies)”就是一个比“industry industries”更简略的表达式 1.1.7 断⾔
符号 定义 (?=pattern) 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95 98 NT 2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 (?!pattern) 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95 98 NT 2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 (?<=pattern) 反向肯定预查,与正向肯定预查类拟,只是方向相反。例如,“(?<=95 98 NT 2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows” (?<!pattern) 反向否定预查,与正向否定预查类拟,只是方向相反。例如“(?<!95 98 NT 2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows” 1.2 正则表达式网站
以下是常用的一些在线正则表达式测试工具,其中个人感觉第一个最好!
- http://regex101.com/
- http://regexr.com/
- http://tool.lu/regex/
- http://tool.oschina.net/regex/
- http://tool.chinaz.com/regex/
1.3 正则表达式工具
1.4 常用的正则表达式
需求 正则表达式 用户名 ^[a-z0-9_-]{3,16}$ 密码 ^[a-z0-9_-]{6,18}$ 十六进制值 ^#?([a-f0-9]{6} [a-f0-9]{3})$ 电子邮箱 ^([a-z0-9_.-]+)@([da-z.-]+).([a-z.]{2,6})$/ URL ^(https?://)?([da-z.-]+).([a-z.]{2,6})([/w .-]*)*/?$ IP 地址 /((2[0-4]d 25[0-5] [01]?dd?).){3}(2[0-4]d 25[0-5] [01]?dd?)/ /^(?:(?:25[0-5] 20-4 [01]?0-9?).){3}(?:25[0-5] 20-4 [01]?0-9?)$/</div> HTML 标签 ^<([a-z]+)([^<]+)*(?:>(.*)</1> s+/>)$ 删除代码\注释 (?<!http: S)//.*$ Unicode编码中的汉字范围 ^[u2E80-u9FFF]+$ 一个单词连续出现的位置 b([a-z]+) 1b/gi 匹配空行 ^s*$ 匹配中文字符 [u4e00-u9fa5] 匹配双字节字符(包括汉字在内) [^x00-xff] 匹配空白行 ns*r 匹配国内电话号码 d{3}-d{8} d{4}-{7,8} 匹配腾讯QQ号 1-9{4,} 匹配中国邮政编码 [1-9]d{5}(?!d) 匹配18位身份证号 ^(d{6})(d{4})(d{2})(d{2})(d{3})([0-9] X)$ 匹配(年-月-日)格式日期 ([0-9]{3}[1-9] 匹配正浮点数 ^[1-9]d*.d* 0.d*[1-9]d*$ 匹配负浮点数 ^-[1-9]d*.d* -0.d*[1-9]d*$