var regex = /(\d{4})-(\d{2})-(\d{2})/;
var string = "2017-06-12";
var result = string.replace(regex, "$2/$3/$1");
console.log(result);
// => "06/12/2017"
其中replace中的,第二个参数里用$1、$2、$3指代相应的分组。等价于如下的形式:
var regex = /(\d{4})-(\d{2})-(\d{2})/;
var string = "2017-06-12";
var result = string.replace(regex, function(){
return RegExp.$2+"/"+RegExp.$3+"/"+RegExp.$1;
});
console.log(result);
// => "06/12/2017"
也可以写成
var regex = /(\d{4})-(\d{2})-(\d{2})/;
var string = "2017-06-12";
var result = string.replace(regex, function(match,year,month,day){
return month+"/"+day+"/"+year;
});
console.log(result);
// => "06/12/2017"
反向引用
除了使用相应API来引用分组,也可以在正则本身里引用分组。但只能引用之前出现的分组,即反向引用。
还是以日期为例。
比如要写一个正则支持匹配如下三种格式:
2016-06-12
2016/06/12
2016.06.12
可能会想到这个正则
var regex = /\d{4}(-|\/|\.)\d{2}(-|\/|\.)\d{2}/;
var string1 = "2017-06-12";
var string2 = "2017/06/12";
var string3 = "2017.06.12";
var string4 = "2016-06/12";
console.log( regex.test(string1) ); // true
console.log( regex.test(string2) ); // true
console.log( regex.test(string3) ); // true
console.log( regex.test(string4) ); // true
其中/和.需要转义。虽然匹配了要求的情况,但也匹配"2016-06/12"这样的数据。
假设我们想要求分割符前后一致怎么办?此时需要使用反向引用:
var regex = /\d{4}(-|\/|\.)\d{2}\1\d{2}/;
var string1 = "2017-06-12";
var string2 = "2017/06/12";
var string3 = "2017.06.12";
var string4 = "2016-06/12";
console.log( regex.test(string1) ); // true
console.log( regex.test(string2) ); // true
console.log( regex.test(string3) ); // true
console.log( regex.test(string4) ); // false
正则表达式 括号
文本参考 https://juejin.im/post/6844903487155732494
内容包括:
分组
/a+/ 匹配连续出现的a ,要匹配连续出现的"ab"时,需要使用/(ab)+/
分支结构
在多选分支结构(p1|p2)
如果去掉正则中的括号,即/^I love JavaScript|Regular Expression$/,匹配字符串是"I love JavaScript"和"Regular Expression",当然这不是我们想要的。
引用分组
以日期为例。假设格式是yyyy-mm-dd的,我们可以先写一个简单的正则:
带括号版 可以提取年、月、日
match 返回一个数组,第一个元素是整体匹配结果,然后是各个分组(括号里)匹配的内容,然后是下标,最后是输入的文本
使用正则对象的exec方法
也可以使用构造函数的全局属性$1-$9来获取
替换
比如,想把yyyy-mm-dd格式,替换成mm/dd/yyyy怎么做
其中replace中的,第二个参数里用$1、$2、$3指代相应的分组。等价于如下的形式:
也可以写成
反向引用
除了使用相应API来引用分组,也可以在正则本身里引用分组。但只能引用之前出现的分组,即反向引用。
还是以日期为例。
比如要写一个正则支持匹配如下三种格式:
可能会想到这个正则
其中/和.需要转义。虽然匹配了要求的情况,但也匹配"2016-06/12"这样的数据。
我们可以看看这个正则匹配模式:
非捕获分组
之前文章中出现的分组,都会捕获他们匹配到的数据,以便后续引用,因此也称他们是捕获型分组
如果只想要括号最原始的功能,但不会引用它,即不在API里引用,也不在正则里反向引用,此时可以使用非捕获分组(?:p)
相关案例
字符串trim方法模拟
去掉字符串开头和结尾的空白符
前者效率更高一些
将每个单词的首字母转换成大写
驼峰化
它的逆过程,使用了括号,以便提供引用,也很简单
通过key获取相应的分组引用,然后作为对象的键
匹配成对标签
要求匹配
不匹配
匹配一个开标签,可以使用正则<[^>]+>
匹配一个闭标签,可以使用<\/[^>]+>
但是要求匹配成对标签,那就是要使用反向引用
其中开标签 <[^>]+> 改成 <([^>]+)> 使用括号的目的是为了后面的反向引用,而提供分组,闭标签使用了反向引用<\/\1>