正则表达式 学习资料整理

时间:2021-05-18

常用正则表达式 整理篇
https://效率要低的多,因为前者必须使用组中的回溯操作,回溯是很艰难的过程,所以当使用非回溯的正则表达式时时可以显著提高正则表达式的效率的。

其实正则表达式是只注重匹配结果的,所以会努力去匹配所存在的字符串。这就是它的贪婪性所在。(这点其实理解的不是太深)。

注意以上这些(1-5)都不能够用于反向引用,因为以上声明将不作为匹配的一部分。

2.7在正则表达式中做决策

高级决策的两种写法:

1=>(?(expression)yes|no)

2=>(?(?=expression)yes|no)

这两种方式中的的expression匹配则后面进行匹配yes,否则匹配no。

需要注意的一点是yes测试和决策测试是在同一个起点里进行的。

如以下字符串:77-77A 69-AA 57-B

匹配表达式为:(\d7)?-(?(1)\d\d[A-Z]|[A-Z][A-Z])

匹配结果为:

1.77-77A 2. –AA

这个正则表达式中用到了引用组,(?(1)**)中的1也可以换为\1,这样不影响匹配。这个匹配中如果将决策后面的\d\d去掉则会出现不同的结果,这时只会有一个-AA是匹配的。因为决策点和yes表达式是从同一个起点开始匹配所以即使决策点匹配了,但是后面的yes表达式仍然不匹配。就只匹配no部分的表达式。最终结果也必然改变,理解这一点很重要。

2.8正则表达式的选项

快到结尾了,再说下正则表达式的选项。选项其实就是将正则表达式的设置改到组中来。如(?i:[a-z])将忽略大小写进行匹配。实际上如果学过Javascript中的正则表达式,可以看出这个i在javascript中表示的还是这个意思。

N

规定只有显示命名的组标号的组才能有效的捕获

I

此选项匹配不区分大小写的匹配

X

此选项规定,非转义的空字符被排除在模式之外,并启用了一个前缀#的注释

M

指定多行模式,修改了^和$的定义

S

指定单行模式

2.9正则表达式的规则

1.正则表达式会对输入字符传进行最快的匹配,它一次搜索一个字符,知道实现第一次匹配。

2.发现一个匹配的开始后,正则表达式引擎将继续匹配,直到遇到一个不被模式接收的字符。

3.Regex引擎非常贪婪—只要模式匹配它将匹配尽可能多的字符。

4.Regex渴望实现匹配,所以将在需要时回溯以实现匹配。

5.Regex引擎总是先选择第一个选项。在|式表达式中。

以上的几点很重要。到这正则表达式的几乎所有规则也就讲完了。

最后附一个懒惰匹配常用修饰和其他的限定

*?

尽可能少地使用重复的第一个匹配

+?

尽可能少地使用重复但至少使用一次

??

使用零次重复(如有可能)或一次重复

{n}?

等同于{n}

{n, }?

尽可能少地使用重复但至少使用n次

{n,m}?

介于n和m之间,尽可能少地使用重复

作者:hanxing0的专栏

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章