但有个事实我们应该注意,比如我用 /good|goodbye/,去匹配 "goodbye" 字符串时,结果是 "good"
var regex = /good|goodbye/g; var string = "goodbye"; console.log( string.match(regex) ); // => ["good"]
而把正则改成 /goodbye|good/,结果是:
var regex = /goodbye|good/g; var string = "goodbye"; console.log( string.match(regex) ); // => ["goodbye"]
也就是说,分支结构也是惰性的,即当前面的匹配上了,后面的就不再尝试了。
反向引用
比如要写一个正则支持匹配如下三种格式
2020-02-25
2020/02/25
2020.02.25
var regex = /d{4}(-|/|.)d{2}(-|/|.)d{2}/;
var string1 = "2020-06-12";
var string2 = "2020/06/12";
var string3 = "2020.06.12";
var string4 = "2020-02/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}1d{2}/;
var string1 = "2020-06-12";
var string2 = "2020/06/12";
var string3 = "2020.06.12";
var string4 = "2020-02/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
注意里面的 1,表示的引用之前的那个分组 (-|/|.)。不管它匹配到什么(比如 -),1 都匹配那个同 样的具体某个字符。
我们知道了 1 的含义后,那么 2 和 3 的概念也就理解了,即分别指代第二个和第三个分组。
使用例子
字符串 trim 方法模拟
function trim(str) {
return str.replace(/^s+|s+$/g, '');
}
表示一个 16 进制字符,可以用字符组 [0-9a-fA-F]。 其中字符可以出现 3 或 6 次,需要是用量词和分支结构。 使用分支结构时,需要注意顺序。 正则如下
var regex = /#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/g;
var string = "#ffbbad #Fc01DF #FFF #ffE";
console.log( string.match(regex) );
// => ["#ffbbad", "#Fc01DF", "#FFF", "#ffE"]
上面内容就结束了,下面是其他网友的补充可以参考一下
var regExp = /8.*8/;
var str = "8google8 8google8 8google8";
上面例子,是贪婪模式,其实是用了重复(区间)匹配的正则表达式都为贪婪模式
前瞻模式是指某个匹配后面必须跟着某个字符串,例子如下
var regExp = /goo(?=gle)/;
var strOne = google;
var strTwo = googoo;
定语式 返回匹配的是 后面是带 gle 的;
捕获性分组和非捕获性分组:例子如下:









