[正则表达式]基础工具书篇 关于边界

Posted wei4118268

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[正则表达式]基础工具书篇 关于边界相关的知识,希望对你有一定的参考价值。

写在之前:以下所有的元字符,匹配的不是实际的字符,而是一个“虚”的位置。

1. 整体边界
1. 匹配起始位置的 ^

^ 写在字符集中第一个方括号的后边,表示“非”。
^ 写在整个正则表达式的最前边,则表示匹配输入字符串的起始位置,即开头。简单的说,就是以什么什么为开头。

比如,我们想要通过正则表达式匹验证手机号码。

如果我们使用正则表达式 1[35789]\\d{9}去匹配,会把 00015599998888这样的字符串验证通过。因为我们确实可以在这个字符串中,匹配出符合这个正则的字符串。

单纯的为了防止在开头多几位数的错误手机号通过验证,我们应该将正则表达式修改为 ^1[35789]\\d{9}。即只有以 13 15 17 18 19开头的,且能在其后匹配出9个数字的字符串,可以验证通过。

2. 匹配结束位置的 $

$ 写在整个正则表达式的最后边,则表示匹配输入字符串的结束位置,即末尾。简单的说,就是以什么什么为结尾。

返回上边的例子,正则表达式,已经被优化为 ^1[35789]\\d{9}

但是细心的人会发现,1559999888866666这样的字符串还是会验证通过。为了保证手机号只有11为,我们应该将正则表达式修改为 ^1[35789]\\d{9}$

即只有以 13 15 17 18 19开头的,且后边只有9个数字就结束的,可以验证通过。

3. \\b\\B

\\b用来匹配单词(数字)的边界,比如单词与符号之间、单词与空格之间的位置等。
用严谨一点的说法,就是\\w\\W之间的位置(尚未考究)。

虽说是边界,但是匹配的只是一个虚的位置(可以想象为\\w\\W两个字符中间的那个缝隙),而不是实际的字符。

\\B则反过来,匹配非单词的边界,即\\w\\w之间的位置,或\\W\\W之间的位置。
也就是单词(数字)中两个相邻字符中间的那条缝隙,或者两个符号中间的那条缝隙。

同样,匹配的是一个虚的位置。

利用这两个符号,我们最常做的,就是利用 replace,在字符串中插入字符。
举一个最经典的例子,数字的三位分节法:

//js
"1234567890".replace(/\\B(?=(?:\\d{3})+$)/g,",")
//"1,234,567,890"

(?=(?:\\d{3})+$)是一个正向预查,表示 我们要匹配的\\B,的后边的数字必须是三个一组三个一组(有最少一组)来结尾的。
满足这样条件的,数字之间的缝隙(非单词边界),全部(正则后有全局修饰符g)替换(插入)为一个逗号。

以上是关于[正则表达式]基础工具书篇 关于边界的主要内容,如果未能解决你的问题,请参考以下文章

[正则表达式]基础工具书篇 字符

[正则表达式]基础工具书篇 匹配次数

(基础篇) 正则表达式详解

Linux正则表达式——基础篇

shell学习之正则表达式基础篇

(基础篇) 正则表达式详解