正则表达式最常用的几种形式
正则表达式提供了一种字符串匹配模式的描述形式,通过简单的符号就能表达丰富的文本结构。如
[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 语法文档
至于想要匹配的内容如何书写正则表达式,这与需求相关,可以在面临实际问题时去翻阅语法说明或其它方式寻求答案。