学习正则表达式

参考视频

参考博客1

参考博客2

字符组[]

[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  不可以匹配

 
模式的冲突
如果在正则表达式内部,通过模式作用范围指定了模式。而在外部又指定了其他模式参数,则模式作用范围的优先级更高
 

 
 
原文地址:https://www.cnblogs.com/0banana0/p/2490967.html