正则表达式是文本处理极为重要的技术,1970年代,Unix之父Ken Thompson将正则表达式引入到Unix文本编辑器sed和grep中,由此正则表达式普及开来。
1980年后,perl语言对Henry Spencer编写的库扩展了很多新的特性,1997年开始,Philip Hazel开发出了PCRE,被php和httpd等工具采用。
正则表达式应用极其广泛,shell中处理文本的命令,各种高级编程语言都支持正则表达式。
参考 https://www.w3cschool.cn/regex_rmjc/
元字符(metacharacter)
代码 | 说明 | 举例 |
. | 匹配除换行符外任意一个字符 | . |
[xyz] | 字符集合,只能表示一个字符位置,匹配所包含的任意一个字符 | [xyz]匹配xvvz中的'xz' |
[^xyz] | 字符集合,只能表示一个字符位置,匹配除去所包含字符的任意一个字符 | [^xyz]匹配xvvz中的'vv' |
[a-z] | 字符范围,也是一个集合,表示一个字符位置,匹配所包含的任意一个字符 | [a-z][A-Z][0-9] |
\b | 匹配单词边界 | \bb 匹配已b开头的字符 |
\B | 匹配非单词边界 | \Bb 匹配不以b开头的含有b的单词 |
\d | [0-9]匹配0-9之间的任意一个数字 | \d |
\D | [^0-9]匹配任意一个非数字的字符 | \D |
\s | 匹配一位空白字符,包括换行符,制表符,空格 | \s |
\S | 匹配一位非空白字符 | \S |
\w | 匹配[a-zA-Z0-9_]包括中文的字符 | \w |
\W | 匹配\w之外的任意字符 | \W |
Linux下换行符是\n,win下换行符是\r\n
单行模式
.可以匹配所有字符,包括换行符
^表示整个字符串的开头,$表示整个字符串的结尾
多行模式
.可以匹配除了换行符之外的字符
^表示行首,$表示行尾
^表示整个字符串的开始,$表示整个字符串的结尾,开始指定的是\n后紧接着下一个字符,结束指的是/n前的字符
转义: \, \\表示\
重复
代码 | 说明 | 举例 |
* | 表示前面的正则表达式会重复0次或多次 | a\w* 单词中有a然后后面是非空白字符 |
+ | 表示前面的正则表达式重复至少一次 | a\w+ 单词中a后面至少有一个非空白字符 |
? | 表示前面的正则表达式会重复0次或1次 | a\w? 单词中a后面最多有一个空白字符 |
{n} | 重复固定的n次 | a\w{1}单词中a后面只能有一个非空白字符 |
{n,} | 重复至少n次 | a\w{1,}等价a\w+ a\w{0,}等价e\w*a\w{0,1}等价e\w? |
{n,m} | 重复至少n次,最多m次 | a\w{0,10}单词中a后面至少1个,至多10个非空白字符 |
x|y | 匹配x或者y | w|food或者(w|f)ood,匹配wood或者food |
(pattern) | 使用小括号指定一个分组,配好从1开始 | (very) |
\数字 | 匹配对应的分组 | (very) \1 |
(?:pattern) | 改变优先级,不认为是分组 | (:?very),不是分组不能用数字调用 |
(?=exp) | 断言exp一定在匹配的右边出现,一定有exp后缀 | f(?=oo)f后面一定有oo出现,匹配是f而不是oo |
(?<=exp) | 断言exp一定在匹配的左边出现,一定有exp前缀 | (?<=t)ook,匹配ook前面一定有t出现,匹配ook |
(?!exp) | 断言后面一定不是exp | too(?!d),匹配too后面不是d的too |
(?<!exp) | 断言前面一定不是exp | (?<!f)ood 匹配ood左边不是f的ood |
断言不占分组号
正则表示工作在贪婪模式中,默认匹配更长的字符,非贪婪模式需要在符号前面加一个?,表示尽量少的匹配
代码 | 说明 |
*? | 匹配任意次,尽可能的少匹配 |
+? | 匹配至少一次,尽可能的少重复匹配 |
?? | 匹配0次或者1次,尽可能的少重复匹配 |
{n,}? | 匹配至少n次,尽可能的少重复 |
{n,m}? | 匹配至少n次,至多m次,尽可能的少重复 |