使用元字符
元字符 | 说明 |
---|---|
\d | 任何一个数字字符 |
\D | 任何一个非数字字符 |
\w | 任何一个字母数字字符 [a-zA-Z0-9_] |
\W | 任何一个非字母数字或非下划线字符 |
\s | 空白字符(等价于[\f\n\r\t\v]) |
\S | 非空白字符 |
\x | 十六进制前缀 |
\0 | 八进制前缀 |
POSIX字符类
字符类 | 说明 |
---|---|
[:alnum:] | 字母或数字[a-zA-Z0-9] |
[:alpha:] | 字母 |
[:blank:] | 空格或制表符 |
[:cntrl:] | ASCII控制字符 |
[:digit:] | 数字 |
[:graph:] | 和[:print:]一样,但不包括空格 |
[:lower:] | 小写字母 |
[:print:] | 可打印字符 |
[:punct:] | 既不属于[:alnum:]也不属于[:cntrl:] |
[:space:] | 空白字符,包括空格 |
[:upper:] | 大写字母 |
[:xdigit:] | 十六进制数字 |
[[xxxx]]
重复匹配
+匹配一个或多个字符(至少一个;不匹配零个字符的情况)
一般来说,当在字符集合里使用的时候,像.和+这样的元字符将被解释为普通字符,不需要被转义,但转义了也没有坏处。[\w.]的使用效果和[\w.]一样
*匹配零个或多个字符
?匹配零个或一个字符
{数值}匹配的重复次数
{2,4}为重复匹配次数设定一个区间
{3,}匹配至少重复多少次
防止过度匹配
*和+都是贪婪型元字符
贪婪型元字符 | 懒惰型元字符 |
---|---|
* | *? |
+ | +? |
{n,} | {n,}? |
位置匹配
边界
使用边界限定符,也就是 在正则表达式里用一些特殊的元字符来表明我们想让匹配操作在什么位置(或边界)发生。
\b单词边界
\b用来匹配一个单词的开始或结尾
\B不匹配一个单词边界
字符串边界
^开头
$结尾
分行匹配模式(?m)
使用子表达式
把一个表达式划分为一系列子表达式的目的是为了把那些子表达式当作一个独立元素来使用。子表达式必须用(和)括起来
|或
子表达式的嵌套
回溯引用:前后一致匹配
[ ]+ (\ w+) [ ]+ \1
这个模式的最后一部分是\l; 这是一个回溯引用,而它引用的正是前面划分出来的那个子表达式: 当(\w+) 匹配到单词of 的时候, \1 也匹配单词of; 当(\w+)匹配到单词and 的时候, \1也匹配单词and 。
回溯引用在替换操作中的应用
替换操作需要用到两个正则表达式:一个用来给出搜索模式,另一个用来给出匹配文本的替换模式。
大小写转换
元字符 | 说明 |
---|---|
\E | 结束\L或\U转换 |
\l | 把下一个字符转换为小写 |
\L | 把\L到\E之间的字符全部转换为小写 |
\u | 把下一个字符转换为大写 |
\U | 把\U到\E之间的字符全部转换为大写 |
(<[Hh]1>)(.*?)(</[Hh]1>) $1\U$2\E$3
前后查找lookaround
-
向前查找lookahead
-
向后查找lookbehind
向前查找
一个以?=开头的子表达式,需要匹配的文本跟在=的后面
向后查找
操作符?<=
(?<=$)[0-9.]+
向前查找和向后查找结合
(?<=) (?=)
对前后查找取非
正向前查找 (?=)
正向后查找 (?<=)
负向前查找 (?!)
负向后查找 (?<!)
嵌入条件
并非所有的正则表达式实现都支持条件处理
正则表达式里的条件
-
?匹配前一个字符或表达式
-
?=和?<=匹配前面或后面的文本
-
根据一个回溯引用来进行条件处理
-
根据一个前后查找来进行条件处理
回溯引用条件
(?(backreference)true-regex)
?表明这是一个条件
括号里的backreference是一个回溯引用
true-regex是一个只在backreference存在时才会被执行的子表达式
否则表达式--条件没有得到满足时被执行
(?(backreference)true-regex|false-regex)
前后查找条件
把回溯引用(括号里的回溯引用编号)替换为一个完整的前后查找表达式就行了