正则表达式之模式修正符
众所周知,我们可以利用正则表达式在文本中匹配自己想匹配的字符,而为了方便我们匹配字符,于是出现了一种帮助匹配的字符,叫做:
模式修正符
模式修正符可以帮我们提高自己工作的效率,接下来我们就来介绍一下模式修正符。
1.介绍
对于模式修正符,其实就是在正则表达式后面加上一个“/”,再在后面加上一些特定的字母,便可以对匹配的字符做出限定,而这个限定是全局的,也就是说,它的优先级是最高的。
2.字符
而在“/”后面可以加上的字符有这些:
字符 | 原词 | 含义 |
---|---|---|
g | global | 匹配全部可匹配结果 |
m | multi line | 多行模式(此模式下^和$可以分别匹配行首和行尾) |
i | insensitive | 不区分大小写 |
x | extended | 忽略空白字符,可以多行书写,并使用#进行注释说明 |
s | single line | 单行模式(此状态下”.“可以匹配任意字符,包括换行符) |
u | unicode | 模式字符串被当作UTF-8 |
U | Ungreedy | 使量词默认为非贪婪模式 |
A | Anchored | 从目标字符串的开头开始匹配 |
Z | 从目标字符串的末尾或出现在字符串末尾的 \n 之前开始匹配 | |
z | 从目标字符串的末尾开始匹配 | |
J | Jchanged | 允许子模式重复命名 |
D | Dollar end only | 字 符 仅 匹 配 目 标 字 符 串 的 结 尾 ; 没 有 此 选 项 时 , 如 果 最 后 一 个 字 符 是 换 行 符 的 话 字符仅匹配目标字符串的结尾;没有此选项时,如果最后一个字符是换行符的话 字符仅匹配目标字符串的结尾;没有此选项时,如果最后一个字符是换行符的话字符也能匹配 |
3.实例
话不多说,上图
例子:
首先我们选择匹配abc
1)g:匹配全部可匹配结果
未加“g”之前
加了“g”后
(ps:我使用的网址是直接点击“g”就可以调整模式修正词了)
可以看出未加“g”之前只能匹配一个结果,加上“g”后就可以匹配多个结果。
2)m:多行模式(此模式下^和$可以同时匹配行首和行尾)
此模式下可以同时运用元字符“^”和“$”
未加“m”之前:
加上“m”以后:
但有一点要注意,当它们同时出现在同一段字符的时候,它们只会匹配这一段字符占了一行的字段(“g”和“m”同时加上)
比如我决定匹配“ac”,单独加上“^”和“$”分别是这样的:
而两个一起放上去是这样的:
可以发现,单独使用“^”和“$”匹配都会出现两次结果,而两个一起加上去只出现了一个结果,而且这个结果前两次也出现过,这是什么情况?
似乎有点像找公倍数。
再换个字符试试看。
^bc$
欸,这又是什么意思?怎么一个都没匹配到?
把“^”去掉试试看
一下子多出了五个!
这下搞懂了,当我们同时对一段字符加上“^”“$”时,它只会匹配占了一行的这一段字符。
为了验证猜想,试着在加上一行“bc”试一试。
果然如此!
3)i:不区分大小写
“i”可以帮我们不区分大小写地去匹配字符,某些场景可以发挥很大的作用
为了方便大家观察,我选择加上“g”一起实验
未加“i”之前:
加上“i”之后:
可以发现匹配的结果多出了一个“Abc”
4)x:忽略空白字符,可以多行书写,并使用#进行注释说明
“x”的作用是忽略空白字符,可以多行书写,还可以使用#进行注释说明
这次需要分三次讲解
首先看“x”的第一个作用:忽略空白字符
直接上图吧
未加“x”之前:
加上“x”之后:
可以发现,加上“x”之后正则表达式直接忽略了空格直接开始匹配
这很好理解,第二个作用和第一个也是一样的,只是把空格换成了回车
未加“x”之前:
加上“x”之后:
可以看到正则表达式直接忽略了回车直接选择匹配
前面两种都比较简单,第三种也一样简单
使用#进行注释说明,大家都知道“#”是注释的意思,加上了就可以把“#”后的字符忽略,正则表达式也是一样的
未加“x”之前:
加上"x"之后:
可见“bc”直接被注释掉了,只剩下“a”
由此可见加上“x”之后就可以使用“#”了。
4)s:单行模式(此状态下”.“可以匹配任意字符,包括换行符)
之前讲过,”.“可以匹配任意字符,但独独不能匹配换行符,当我们选择了“s”时,”.“就可以匹配换行符了。
例子:
a.c
未加”s“之前:
加上”s“之后:
可以看到使用”s“以后就可以匹配任何”aXc“格式的字符了,包括换行符。
5)u:模式字符串被当作UTF-8
当我们选择“u”时,模式字符串就会被正则表达式当作UTF-8。这个不过多解释。
6)U:使量词默认为非贪婪模式
关于这个“U”稍稍有些难以理解,它可以使量词默认为非贪婪模式,这是什么意思呢?
看下图:
上面是未加上“U”之前的情况,第一张图是贪婪模式,第二张是非贪婪模式,这很正常,但加上“U”之后就不对劲了(贪婪模式和非贪婪模式详见上一篇文章,本文结尾有链接)。
看下图:
可以发现本该贪婪模式出现的情况却在非贪婪模式出现了,而非贪婪模式也一样。
于是可以得出结果:选择用“U”时,正则表达式就会默认非贪婪模式,当我们尝试用贪婪匹配的时候,它会给出非贪婪模式所匹配的结果。
7)A:从目标字符串的开头开始匹配
这个“A”和我们之前学的元字符“^”的作用是一样的。也就是从开头开始匹配,默认是匹配第一个想匹配的字符。
未加“A”之前:
加上“A”以后:
8)Z:从目标字符串的末尾或出现在字符串末尾的 \n 之前开始匹配
这个“Z”的作用和元字符“$”一样。这和”A“是相同的,不再过多赘述(我使用的正则表达式网页并没有这个修正词,所以也不去截屏了)
9)z:从目标字符串的末尾开始匹配
同上,只是比”Z“少了一个功能
10)J:允许子模式重复命名
这个”J“是用子模式的时候使用的,暂时不去多讲,后面学到了再讲。
11)D:$ 字符仅匹配目标字符串的结尾;没有此选项时,如果最后一个字符是换行符的话,$ 字符也能匹配
当我们选中”D“时,$ 字符仅匹配目标字符串的结尾。这似乎和没加是一样的,但其实不然。没有选择”D“时,如果最后一个字符是换行符的话,$字符也是可以匹配的
未加”D“之前:
加上”D“之后:
可以看到确实上面所讲的一样。
4.总结
至此,已经讲完了绝大部分的内容,如果还有我没有讲到的,那是因为我目前的能力不够导致的,我会继续努力,谢谢!
本文运用的正则表达式网址为:https://regex101.com/