正则表达式基础语法讲解

关注我们的人都能找到高薪工作

1.正则表达式简介

正则表达式(Regular expression,简写为Regexes)是一种用来操作和检验字符串数据的强大工具。它相当与一串特殊的字符,用它可以转换成算法,对文本进行匹配等操作。

事实上正则表达式有其自身的一套语法,这种语法对于初学者来说显得有些晦涩难懂。尤其是其构造比较困难,称为很多入门者的障碍。但当掌握后却可以轻易的解决以前不容易解决的很多文本类问题,如验证提取等。

其常用场合有如下三种:

Ø测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。

Ø替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后可以全部将其删除,或者替换为别的文字。

Ø根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。

2.正则表达式基础语法

2.1匹配不同类型的字符

2.2定位控制字符

2.3指定重复字符

2.4特殊控制类

2.5 特殊字符转义序列

2.6正则表达式分组、替换、反向引用等高级应用

以上只是正则表达式的基础部分,从这里开始才算真正开始正则表达式之旅。

分组

分组技术可以匹配在一个组中的所有字符,用()来表示,是下面两个技术的基础所在。“()“又称捕获符号。

1.捕获:()例子:ABC1EDF2UU

匹配组表达式:([A-Z])\d--匹配3个连续大写字母和一个数字

匹配结果:1.ABC1,2.EDF2

如果用C#中的group,则为ABC,EDF。因为group搜集的是匹配组的内容。

2.非捕获(?:)

使用了非捕获就说明该()中的内容将不作为捕获的组返回,而和其它表达式共同构成匹配项返回。也就是捕获组将不存在。

例:1AF3EDC

匹配表达式:(?:\d|[A-Z])\w--匹配一个数字或字母加一个任意的字符。

匹配结果:1.1A2.F3 3.ED

没有组被捕获

2.通过名称捕获(?)

定义了名称捕获的组可以在反向匹配中运用名称进行反向引用而不需要再使用数字进行反向捕获。注意组名区分大小写!

替换

替换,顾名思义,是将匹配的字符替换成其他指定的字符形式。这个功能是在分组的基础上的(当然或许可以单独存在,但是那样匹配的功能显然不够强大)。在这里有一个技巧是使用附加的匹配字符控制匹配内容。

反向引用

反向匹配可以引用前面组中的匹配形式。“\匹配组的数字表示(1为基数)“或者”\k“

高级组

1.正声明(?=)

规定了括号中的模式必须出现在声明的右侧。模式将不构成匹配的一部分。

2.负声明(?!)

规定了括号中的模式不能出现在声明的右侧,模式将不构成匹配的一部分。

3.反向正声明(?

规定了括号中的模式必须出现在声明的左侧,模式将不构成匹配的一部分。

4.反向负声明(?

规定了括号中的模式必须出现在声明的左侧。模式不构成匹配的一部分。

5.非回溯(?>)

防止了正则表达式引擎搜索失败时回溯,这称之为贪婪的子表达式。

如输入字符串:Hewas very trusting.

正则表达式:.*ing将匹配trusting但是如果加入(?>)ing则不能完成匹配。

非回溯组也是非捕获组。他对于提高正则表达式的效率很有效。

如匹配一个www.****.com的网址。使用www\.(.*)\.com显然要比www\.([^.]*)\.com效率要低的多,因为前者必须使用组中的回溯操作,回溯是很艰难的过程,所以当使用非回溯的正则表达式时时可以显著提高正则表达式的效率的。

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

注意以上这些(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.–A

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

2.8正则表达式的选项

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

2.9正则表达式的规则

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

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

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

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

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

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

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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180410B19H4600?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券