正则表达式提供了一种字符串匹配模式的描述形式,通过简单的符号就能表达丰富的文本结构。如 [a-z]+ 就可以表示所有字母的组合。

以下是在实际项目中使用得最多的三种情形。

1 判断

如判断用户的输入是否符合要求。通常使用正则表达式的 test 方法,当传入的字符串符合正则表达式的模式要求时会返回 true。

如仅允许输入数字,可用以下方法检测:

function checkNum(inputStr){
    return /^\d+$/.test(inputStr);
}

其中正则表达式 ^\d+$ 中,第一个符号 ^ 表示字符串首,最后的 $ 表示字符串尾,加上这两个表示必须整串字符完全跟模式匹配才返回 true。而如果没有,则只要字符串中包含符合模式的串就会返回 true。

2 寻找

在文本中寻找指定形式的匹配串,如手机号、邮箱等。在 javascript 中,通常可以使用字符串对象的 match 方法。此时,正则表达式作为 match 方法的参数传入。

如,找出文本中所有的数字串:

function findNum(inputStr){
    return inputStr.match(/\d+/g);
}

// 调用示例
console.log( findNum("a123abb90,78a909").join() );

上边调用示例会输出匹配的数组数据:123,90,78,909
正则表达式 \d+ 表示数字串,而表达式对象 /\d+/ 外的 g 是一个选项,表示全局搜索,表明要找出所有的匹配项。如果没有这个 g,则只会返回第 1 个匹配结果。

此外,也可以使用正则表达式的 exec 方法,匹配第 1 个符合模式的字符串。如 /\d+/.exec("a123abb90,78a909") 得到 123

当然,如果文本中不包括匹配的内容则会返回 null。

3 替换

将文本中符合指定模式的匹配串替换成别的字符串,使用字符串的 replace 方法。如,将上边示例字符串中的非数字部分替换成逗号,这种情形在对用户输入时去除干扰性输入时经常用到。

function replaceNotNum(inputStr){
    return inputStr.replace(/[^\d]+/g, ",");
}

// 调用示例
console.log( replaceNotNum("a123abb90,78a909") );

上边调用示例会输出结果:,123,90,78,909
同样,正则表达式后边的 g 表示全局,如果没有它,则只会替换掉第 1 个匹配的字符串。

有一种情形是替换时经常碰到的:对匹配的内容不是替换成另一个相同的字符串,而是在匹配的基础上进行调整。如将上边示例字符串中的连续数字统一加上中括号。此时可以:

function decorateNum(inputStr){
    return inputStr.replace(/(\d+)/g, '[$1]');
}

// 调用示例
console.log( decorateNum('a123abb90,78a909') );

上边调用示例会输出结果:a[123]abb[90],[78]a[909]
正则表达式 ([\d]+) 加了括号,而替换的字符串中出现了一个$1,这是关键。因为替换的内容跟匹配的内容需要动态关联,需要一种关联机制。这种机制就是,括号中的内容作为子匹配会进行存储,以供后续使用,一共支持 $1 ~ $9共 9 个存储值,这里再举一个例子。

function exchangeNum(inputStr){
    return inputStr.replace(/(\d)(\d)/g, '$2$1');
}

猜猜以下调用会输出什么结果:

console.log( exchangeNum('12 34 56 78') );

4 语法文档

至于想要匹配的内容如何书写正则表达式,这与需求相关,可以在面临实际问题时去翻阅语法说明或其它方式寻求答案。

参考文档:https://www.runoob.com/regexp/regexp-tutorial.html

版权声明:本文为timeddd原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/timeddd/p/11341757.html