标签:正则表达式
正则表达式是一种可以在许多现代应用程序和编程语言中使用的特殊形式的代码模式。
· 可是用它来验证输入是否符合给定的文本模式
· 在大段文本中查找匹配该模式的文本
· 用其他文本来替换匹配该模式的文本或者重新组织匹配文本的一部分
· 把一块文本划分成一系列更小的文本
……等等
1、正则表达式基础
1.1 元字符和语法
字符:
. 匹配任意除换行符‘\n‘ 以外的字符
如:a.c 匹配abc
\ 转义字符
如:a\.c 匹配 a.c
[...] 字符集(字符类)。对应的位置可以是任意字符。 如:a[bcd]e 匹配 abe ace ade
可以单个列出,也可以给定范围,也可以取反^
预定义字符集:
\d 数字[0-9]
\D 非数字,相当于[^\d]
\s 空白字符:[<空格>\t\r\n\f\v]
\S 非空字符:[^\s]
\w 单词字符:[A-Za-z0-9]
\W 非单词字符:[^\w]
字符集合:
[[:space:]] :所有空白字符
[[:punct:]] :所有的标点符号
[[:lower:]] :所有小写
[[:upper:]] :所有大写
[[:digit:]] :所有数字
[[:alnum:]] :匹配字母和数字
[[:alpha:]] :所有字母
次数匹配:
* 匹配前一个字符的0 或无限次
+ 匹配前一个字符1次或无限次
? 匹配前一个字符0次或1次
{m} 匹配前一个字符m次
{m,n} 匹配前一个字符m至n次
*? +? ?? {m,n}? 使* + ? {m,n}变成非贪婪模式
边界匹配(不消耗匹配字符串中的字符)
^ 匹配字符串开头。多行模式下匹配每一行的开头
如:^abc 匹配 abc
$ 匹配字符串结尾。多行模式下匹配每一行的结尾
如:abc$ 匹配 abc
\A 仅匹配字符串开头
\Z 仅匹配字符串末尾
\b 匹配字符串结尾
\B [^\b]
\< 词首, 出现于单词的左侧. \b
\<char
\> 词尾, 出现在单词的右侧. \b
char\>
\<CHAR\> 锚定一个单词
逻辑、分组
| |表示左右表达式任意匹配一个
例如:abc|cbd 匹配 abc 或者cbd
(...) 括号里面的表达式作为分组,后面还可以接数量词
如:(abc){2}匹配 abcabc a(123|456)c 匹配 a123c
(?P<name>) 分组,除了原有的编号外,再指定一个别名。
如:(?P<id>abc){2}匹配abcabc
\<number> 引用编号为<number>的分组匹配到的字符串。
如:(\d)abc\1 匹配 1abc1
(?P=name) 引用别名为<name>的分组匹配到的字符串。
如:(?P<id>\d)abc(?P=id)匹配 1abc1
特殊构造(不作为分组)
(?:...) (...)的不分组版本,用于使用‘|‘或后接数量词
如:(?:abc){2}匹配 abcabc
(?iLmsux) iLmsux的每一个字符代表一个匹配模式,只能用在正则表达式的开头,可选多个。 如:(?i)abc 匹配ABC
(?#...) #后的内容将作为注视被忽略。
如:abc(?#comment)123 匹配 abc123
(?=...) 之后的字符串内容需要 匹配表达式 才能成功匹配。不消耗字符串内容。 如:a(?=\d) 匹配后面是数字的a
(?!...) 之后的字符串内容需要 不匹配表达式 才能成功匹配。不消耗字符串内容。
如:a(?!\d)匹配 后面不是数字的a
(?<=...) 之前的字符串内容需要 匹配表达式 才能成功匹配。不消耗字符串内容。
如:a(?<=\d)匹配 前面是数字的a
(?<!...) 之前的字符串内容需要 不匹配表达式 才能成功匹配。不消耗字符串内容。
如:a(?<!\d)匹配 前面不是数字的a
(?(id/name)yes-pattern|no-pattern) 如果编号为id/别名为name的组匹配到字符串,则需要匹配yes-pattern,否则匹配no-pattern. |no-pattern 可以省略
如:(\d)*abc(?(1)\d|abc) 匹配 1abc2 或者 abcabc
1.2. 数量词的贪婪模式与非贪婪模式
正则表达式通常用于在文本中查找匹配的字符串。
数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。
例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。
标签:正则表达式
原文地址:http://wzgl08.blog.51cto.com/668144/1625992