正则表达式(四):匹配

正则表达式中的位置匹配:正则表达式是匹配模式, 要么匹配字符, 要么匹配位置对于位置匹配, 这里的位置是字符之间的间隙, 进行位置匹配时, 使用正则表达式中存在下面几个‘锚’:^ $ \b \B (?=p) (?!p)
字符 匹配含义
^ 匹配字符串的开头
$ 匹配字符串的结尾
\b 单词边界, 具体就是 \w\W 之间的位置, 以及字符串的开始位置和结尾位置
\B /b 之外的位置
(?=P) p 是一个模式, 这个正则表达式匹配的是P 之前的位置, 或者当前位置之后的字符要匹配正则表达式 P
(?!P) 这个与 (?=P) 意思相反, 是除了 (?=P) 之外的位置

^ 以及 $

用于匹配字符串开头或者字符串结尾的位置:如下例子:将字符的开头和结尾添加特定的字符:
1
2
3
4
let str = 'hello';
let regex = /^|$/g;
let res = str.replace(regex, '*');
console.log(res); // '*hello*'
例如下面, 使用 replace 代替 trim 方法:
1
2
3
4
let str = '  hell o   ';
let regex = /^\s+|\s+$/g;
let res = str.replace(regex, '');
// hell o

\b 以及 \B

使用 \b 的作用是匹配单词边界之间的位置, 具体而言是 \w 以及 \W 之间的位置:\w: 匹配单词字符, 字符包括字母, 汉字, 下划线以及数字示例如下:
1
2
3
4
let str = 'hel lo';
let regex = /\b/g;
let res = str.replace(regex, '#');
// #hel# #lo#
使用 \B 则和 \b 相反, 匹配的位置是单词字符内的位置:
1
2
3
regex = /\B/g;
res = str.replace(regex, '#');
// h#e#l l#o;

(?=P) 以及 (?!P)

使用 (?=P) 用来匹配特定字符前的位置, P 是一个正则表达式;如下: 给单词中的 l 字符前面添加字符 #:
1
2
3
4
regex = /(?=l)/g;
str = 'hello';
let res = str.replace(regex, '#');
// he#l#lo
给每一个单词字符前面添加一个字符 *
1
2
3
4
regex = /(?=\w)/g;
str = 'hello';
let res = str.replace(regex, '*');
// *h*e*l *l*o
使用 (?!P) 用来匹配除了匹配到的正则表达式 P 之前位置之外的其他位置:例如上面的例子, 我们使用 (?!P) 来代替 (?=P):
1
2
3
4
5
6
7
regex = /(?!l)/;
str = 'hello';
let res = str.replace(regex, '*');
// *h*ell*o*
// 当我们仅仅想匹配到单词内部的时候
regex = /(?!l)(?!^)(?!$)/;
// h*ell*o
这里的 (?!^)(?!$) 是匹配除了单词开头和结尾的位置, 这里可以使用 /B 来进行代替; regex = /(?!l)(\B)/ 如下, 给一个数字添加千位分隔符 ','
1
2
3
let str = "12345678";
let regex = /(?!^)(?=(\d{3})+$))/g;
let res = str.replace(regex, ','); // 12,345,678
分析:给一个数字添加一个千位字符的时候, 我们需要在字符尾部向前查找三位字符, 在三位字符前面的位置处添加分隔符 ' ,';
1
(\d{3})+$ // 匹配结尾处向前 3 个或者多个 3 字符倍数的字符
1
(?=(\d{3})+$) // 匹配 3 个字符或者 3 个字符倍数的字符前面的位置
1
(?!^) // 匹配非开头的位置
如下, 给钱数添加人民币符号 ¥
1
2
3
4
let number = '1234';
let regex = /(?=^)/;
let res = number.replace(regex, '¥ ');
// ¥ 1234
如下: 判断一段字符中必须包含有数字:
1
2
3
4
5
let str = 'str123';
let regex = /(?=.*[0-9])^/g;
// 这里的 ^ 表示开头, 这个正则表达式表示开头的位置, 也就是开头之后的字符需要匹配 .*[0-9]
// .*[0-9] 表示任意字符长度后面都需要一个数字, 也就是需要匹配到的字符串必须包含有数字
let res = regex.test(str); // true
如下: 判断字符中不能全部为数字, 可以使用 ?!P 进行判断判断字符中不能全部为数字的反义为全部为数字:那么判断全部为数字的正则表达式为:
1
2
// 判断6位字符串中全部为数字
let regex = /(?=[0-9]{6})/
因为 ?!?= 互为反义, 因此, 判断不能全部为数字的正则如下:
1
2
3
4
5
let regex = /(?![0-9]{6})/
let str = '123456';
regex.test(str); // false
str = 'a23456';
regex.test(str); // true