字符组[]
[0-9] 匹配0123456789
[0-9a-f] 匹配0123456789abcdef
[-09] 匹配 "-" "0" "9"三个字符
排除性字符组[^...]
[^0-5] 匹配非0~5的字符
case[^e] 匹配cas+任意不为e的字符
字符组简记法
[\d] = [0-9]
[\D] = [^0-9]
[\w] = [0-9a-zA-Z-]
[\W] = [^0-9a-zA-Z-]
[\s]匹配空白字符 (回车、换行、制表、空格)
[\S]匹配非空白字符
特殊的简记法:点号
"." 匹配几乎所有任意字符 不能匹配换行符
"\." 匹配点本身
[.] 匹配点本身
量词
作用:限定之前的字符出现的次数
* 之前的字符可以出现0次到无穷多次 0~n
+ 之前的字符至少需要出现1次 1~n
?之前的字符出现0次或至多只能出现1次 0~1
//可选项元素 //?表示可选项元素 //用法看底下的例子 July?.(fourth|4(th)?) July? 匹配 Jul 或者July 4(th)? 匹配4或者4th //也就是?前边的元素是可有可无的都可以匹配成功 //可以匹配一下六种日期写法: July fourth July 4th July 4 Jul fourth Jul 4th Jul 4
匹配hr
<hr( +size *= *[0-9]+)? *> 可以匹配 <hr> <hr > <hr size=50> <hr size=50 > <hr size = 50 >
区间量词
作用:具体规定字符的出现次数
{min,max}
{min,}
{number}
* {0,}
+{1,}
?{0,1}
量词的局限
量词只能规定之前字符或字符组的出现次数
字符组出现的次数:(....) (ac)+
括号的用途:多选结构
作用:表示某个位置可能出现的字符窜
形式:(...|...|...|..)
括号的用途:捕获分组
作用:将括号内的子表达式捕获的字符串存放在匹配结果中,供匹配完成后访问
形式:(...)
string email="gaonanlvmm@gmail.com";
string regex="(\\w+)@([\\w.]+)";
group[0]=gaonanlvmm@gmail.com;
group[1]=gaonanlvmm;
group[2]=gmail.com;
注意:
1.只要使用了括号,就存在捕获分组
2.捕获分组按照开括号出现的从左至右的顺序编号。遇到括号嵌套的情况也是如此
3.如果捕获分组之后存在量词,则匹配结果中,捕获分组保存的是子表达式最后一次匹配的字符串
string email="gaonanlvmm@gmail.com";
string regex="(\\w)+@([\\w.])+";
group[2]=m;
group[3]=m;
不捕获文本的括号不推荐
如果正则表达式很复杂,或者需要处理的文本很长,捕获分组会降低效率
作用:仅仅用来对表达式分组,而不把分组捕获的文本存入结果
形式:(?:...)
括号的用途:反向引用
作用:在表达式的某一部分,动态重复之前的子表达式所匹配的文本
形式: \1
String regex = "<(\\w+)>[^<]+</(\\1)>";
锚点
作用:规定匹配的位置
形式:\b 单词分节符锚点
注意事项: 一侧是单词字符,另一侧是非单词字符
单词字符通常指的是英文字符 数字字符,对中文不适用
非单词字符通常指的是各种标点符号和空白字符
cat0 cat猫 这两种不能正确识别
^ 匹配一行的开头
$ 匹配一行的末尾
\A 匹配整个字符串的开头 \<
\Z 匹配整个字符串的末尾 \>
环视
锚点对位置的判断不够灵活,环视对锚点的补充
作用:应用子表达式对位置进行判断
形式:
(?=...) 肯定顺序环视 右侧文本能由子表达式匹配
(?!...) 否定顺序环视 右侧文本不能由子表达式匹配
(?<=...) 肯定逆序环视 左侧文本能由子表达式匹配
(?<!...) 否定逆序环视 左侧文本不能由子表达式匹配
jeff jeffrey Jefferson
jeff 匹配jeff jeffrey Jefferson
jeff(?=rey) 匹配jeffrey
jeff(?!rey) 匹配jeff Jefferson
see bee tee
(?<s=)ee 匹配see
(?<s!)ee 匹配bee tee
注意事项
环视结构仅用于布尔判断,结构内的子表达式所匹配的文本,不会保存在整个表达式匹配的结果之中
逆序环视结构对子表示存在限制
perl,python:逆序环视结构中的子表达式必须为固定长度
php,java :逆序环视结构中的子表达式可以不定长度,但必须有上限
.NET 逆序环视结构中的子表达式完全没有限制
环视应用实例
修整数值
要求:在数值中的合适位置插入逗号,将其修整为便于阅读的形式
举例:1234567890 ->1,24,567,890
肯定逆序环视
左侧至少出现一位数字
右侧 数字的位数必须是3的倍数
(?<=\\d)(?=(\\d{3})+(?!\\d))
匹配模式
作用:改变某些结构的匹配规定
形式:
I:case Insensitive 不区分大小写
S: SingleLine(dot All) 点号通配 .可以匹配任意字符
M: MultiLine 多行模式 更改^ $的匹配规定 \A 和\Z则不受影响
X: Comment 注释模式
多行模式
hello\nIT\n
正常情况下^IT$ 匹配失败
多行模式 可以匹配成功
注释模式
作用:在正则表达式内部可以使用注释
形式:注释以#开头,以换行符结束(或直到表达式的末尾)
使用此模式后,会忽略正则表达式中的所有空白字符
string str="gaonanlvmm@gmail.com";
string regex="\\w+ #用户名\n"+"#"+"\\s+ #主机名";
里边的空白字符 和#到\n或者#到行末的内容将被忽略 只是给阅读代码的人的提示
模式的混合
作用:同时使用多个模式
形式:在编译正则表达式时,把表示模式的多个参数以竖线"|"连接起来
模式的作用范围
作用:精确控制各个模式的作用范围
形式:在表达式中以 (?ismx)的方式启用模式,以 (?-ismx)的方式停用模式
abc
[?i]AB 可以匹配
[?i]AB[?-i]C 不可以匹配
模式的冲突
如果在正则表达式内部,通过模式作用范围指定了模式。而在外部又指定了其他模式参数,则模式作用范围的优先级更高