正则表达式入门

正则表达式在平时处理文本内容的时候有很大用处,这里就简单的总结一下正则表达式的用法。

一、元字符

在学习正则表达式的时候,首先要了解正则里的一些基本符号。

首先是表示一些单字符。

.  任意字符(除换行符外)

 
\d 任意数字\D 任意非数字
\w 任意字母数字下划线\W 任意非字母数字下划线
\s 任意空白符

\S 任意非空白符

有了单字符之后,需要匹配单字符出现的次数,也就是量词。

*  表示0到多次
+ 表示1到多次
?表示0或1次
{m} 出现m次
{m, } 表示至少出现m次
{m,n} 表示出现m到n次

有了单字符和量词之后,我们可以进行一些简单的匹配,比如下面的正则,在三个字符串中找到aaabb这个词组。

                                                            

但是如果想要做一些精细化的匹配就做不到了,比如我们想做一个匹配手机号的正则,现在我们只能用\d{11}来表示,但是这只能表示长度为11的数字,并不能匹配到符合规则的手机号,这个时候就引入了范围。

|表示或,ab|bc表示ab或者bc
[....]表示选括号任意单个元素,[a-z]表示匹配a-z这26个字母中的任意一个
[^....]表示取反,不选括号内的任意单个元素

 

有了范围之后就可以匹配一定规则的手机号了,如下:

1[3-9]\d{9}

表示符合以下条件的手机号

第 1 位固定为数字 1;
第 2 位可能是 3,4,5,6,7,8,9;
第 3 位到第 11 位我们认为可能是 0-9 任意数字。

二、贪婪与非贪婪

在处理量词的时候,可以选择两种模式,一种是贪婪模式,一种是非贪婪模式。

贪婪模式表示次数的量词尽可能多的匹配
非贪婪模式

表示次数的量词满足条件后,长度最少的,在量词后加?即可表示非贪婪

 

如下图所示,第一个图片表示的是贪婪模式,他尽可能多的匹配了双引号内的单词,第二个图片表示了非贪婪的模式,他匹配了两个双引号内的内容。

                                         

                                            

正则的贪婪和非贪婪的模式下,都会用到回溯。回溯过程如下:

regex:xy{1,3}z

text: xyyz

首先,匹配到了x字符,匹配y字符的时候,由于采用贪婪模式,会尽可能多的匹配字符,匹配到了两个y
然后第三个y去匹配z的时候发现匹配不上,这时候会换z去匹配文本。


regex:xy{1,3}?z

text: xyyz
首先,匹配到了x字符,匹配y字符的时候,由于采用非贪婪模式,会尽可能少的匹配字符,
匹配到1个y之后,就会用z去匹配第二个y,发现匹配不上,就会用第二个y来匹配文本中的y,
匹配上之后,用z去匹配文本中的z

三、分组与引用

分组是一种帮我们简化正则编写的方法,

the little cat cat is in the hat hat, we like it.

比如我想匹配上面连续的两个cat和连续的两个hat,如果不用分组的话,我们只能写成cat cat|hat hat这样的正则表达式。

有了分组之后,我们就可以这样写。

(\w+) \1

其中,\1就表示引用前面括号内的内容,\1就表示和前面的(\w+)一样的内容,所有括号内的内容,我们都可以用\数字的方式引用,如果我们不想引用这个括号里的内容,用(?:内容)就可以取消用\数字的方式来引用。

四、匹配模式

除了上面介绍的内容,正则表达式还有一些匹配模式,用来改变元字符的匹配行为。分别是不区分大小写模式、点号通配模式、多行模式和注释模式。

不区分大小写的模式,用(?i)来表示不区分大小写,可以看到5个含有大小写的cat都被匹配了,如果不用大小写模式,匹配到这5个cat的正则就比较麻烦。

                                                      

点号通配模式,(?s)来表示,这样点号就可以匹配上了换行。正常点号是不能匹配换行符的,所以下面右侧的图匹配了5行,而用了点号通配模式,就只匹配了一条记录。

      

多行模式,(?m)来表示,可以匹配多行,他改变的是^和$的匹配行为。如果不用多行模式的话,会匹配整个文本中匹配开头和结尾。用了多行模式会匹配每一行的开头和结尾。

 

注释模式,(?#)来表示注释,

五、环视

环视是用来表示,匹配的前面和后面满足某种规则的方法,环视的用法如下。

                                     

下面是一个例子,只匹配开头是1-9,一共6位的数字,如果不用环视,最后一行的数字,会被分成两组。

参考资料:

1>极客时间,正则表达式入门课

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值