一、介绍
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。Perl语言的正则表达式功能非常强大,基本上是常用语言中最强大的,很多语言设计正则式支持的时候都参考Perl的正则表达式
二、语法
2.1 元字符
字符 | 说明 |
. | 匹配除换行符以外的任意字符 |
\w | 匹配任何单词字符,包含字母或数字或下划线 |
\W | 匹配任何非单词字符 |
\s | 匹配任意的空白字符,包含空格、制表符、换页字符 |
\S | 匹配任何非空白字符 |
\d | 匹配数字字符 |
\D | 匹配非数字字符 |
\f | 匹配换页字符 |
\n | 匹配换行符 |
\r | 匹配回车字符 |
\t | 匹配跳进字符 |
\v | 匹配垂直跳进字符 |
\A | 不区分单行多行模式,仅匹配字符串的开头。 |
^ | 单行模式匹配下,匹配字符串的开始。多行模式,匹配每一行的字符串开始 |
\z | 不区分单行多行模式,匹配字符串的结束 |
$ | 单行模式匹配下,匹配字符串的结束。多行模式,匹配每一行的字符串结束 |
\b | 匹配某个单词边界,即,某个单词和空格之间的位置。例如,st\b 匹配 test 中的 st,但是不匹配 testa 中的 st |
\B | 匹配非单词边界 |
\ | 取消元字符的转义 |
2.2 重复
代码 | 说明 |
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
<数量词>? | <数量词>指的是 、?等上述表格表达数量的字符,? 使、+、?、{} 变成非贪婪模式。例如*?、?? |
2.3 逻辑、分组
代码 | 说明 |
() |
分组,并按( 出现的顺序依次赋值给匹配后的值,$n,n从1计数 示例: 字符串: aabbcc 正则表达式:((aa)(bb))cc 取值: $0: aabbcc $1: aabb $2: aa $3: bb |
(?:...) |
()的不分组版本,()内的匹配不编号 |
| | |代表左右表达式任意匹配一个 它总是先尝试匹配左边的表达式,一旦成功匹配则跳过匹配右边的表达式。 如果|没有被包括在()中,则它的范围是整个正则表达式 |
[] | 字符集(字符类)。对应的位置可以是字符集中任意字符。 字符集中的字符可以逐个列出,也可以给出范围,如labc]或 [a-c]。第一个字符如果是^则表示取反,如[^abc]表示不是 abc的其他字符。 所有的特殊字符在字符集中都失去其原有的特殊含义。在字 符集中如果要使用]、-或^,可以在前面加上反斜杠,或把] -放在第一个字符,把^放在非第一个字符。 |
(?P<name>...) | 分组,除了原有的编号外再指定一个额外的别名。例如(?P<id>abc) |
\number |
引用编号为number的分组匹配到的字符串, 例如 (\d)test\1 可以匹配 1test1 但不匹配 1test2 |
(?P=name) |
引用别名为<name>的分组匹配到的字符串 例如 (?P<id>\d)test(?P=id) 可以匹配 1test1 ,但不匹配 1test2 |
2.4 断言
代码 | 说明 |
(?iLmsux) |
iLmsux的每个字符代表一个匹配模式,只能用在正则表达式的开头,可选多个 iLmsux 可以为 i, L, m, s, u, x
i: 忽略大小写
L: 字符集本地化,为了支持多语言版本的字符集使用环境 u: 使用\w,\W,\b,\B这些元字符时将按照UNICODE定义的属性 m: 多行模式,改变 ^ 和 $ 的行为 s: '.' 的匹配不受限制,包括换行符 x: 冗余模式,可以忽略正则表达式中的空白和#号的注释 例如 (?i)aaa
|
(?#...) | #后的内容将作为注释被忽略 |
(?=...) |
之后的字符串内容需要匹配表达式才能成功匹配,不消耗字符串内容 例如 a(?=b) 匹配 ab中的a ,不匹配 ad |
(?!..) |
之后的字符串内容需要不匹配表达式才能成功匹配,不消耗字符串内容。 例如 a(?!b) 匹配 ad中的a ,不匹配 ab |
(?<=....) |
之前的字符串内容需要匹配表达式才能成功匹配,不消耗字符串内容。 例如(?<=a)b,匹配ab 中的b ,不匹配 cb |
(?<!....) |
之前的字符串内容需要不匹配表达式才能成功匹配,不消耗字符串内容。 例如(?<!a)b,匹配cb 中的b ,不匹配 ab |
(?(id/name)yes-pattern|no-pattern) |
如果编号为id/别名为name的组匹配到字符,则需要匹配yes-pattern,否则需要匹配no-pattern,no-paternn可以省略。 例如 ^(\()?[^()]+(?(1)\))$ 如果开头是 ( ,结尾必须是 ) |