let str1 = "12345678";
let reg1 = /\d{1,3}(\d{3})*/g
console.log(str1.match(reg1)) // ["123456", "78"]
let str0 = "12345678";
let reg0 = /\d{1,3}/
console.log(str0.match(reg0))
// ['123', index: 0, input: '12345678', groups: undefined]
这个例子的结果是没有使用全局匹配的正则表达式的匹配结果。说白了,就是正则表达式的末尾没跟g。由于不适用全局匹配,所以match()方法只找到源字符串中首次匹配的子串后,就立刻得到返回结果,不再比较之后剩余的部分是否还有能匹配上的内容。
我们可以看到,match()的结果是一个数组,该数组一共有4项。各项代表的意思如下:
第0项:匹配到字符串
第1项:index表示首次匹配上的子串的起始下标。
第2项:input,表示源字符串
第3项:groups:undefined,这表示当前的正则表达式没使用分组
第4项:length,表示匹配到的结果个数,由于这里不使用全局匹配,只找到首次匹配项就结束了,所以匹配结果只有1个,length也就是1。
var str = 'Today is the 286th day of 2018, the 108th Thanksgiving Day.';
var results = str.match(/\d+(t)(h)/); //匹配str中首个以数字开头,并且以th结尾的子串
console.log(results); // ['286th', 't', 'h', index: 13, input: 'Today is the 286th day of 2018, the 108th Thanksgiving Day.', groups: undefined]
有$则先匹配末尾,与正则的从走到右,从外到内不同
// 没有$符时,\d{1,3}会先匹配三个数字,(\d{3})*再匹配三个数字。然后\d{1,3}再匹配剩下的78
let str1 = "12345678";
let reg1 = /\d{1,3}(\d{3})*/g
console.log(str1.match(reg1)) // ["123456", "78"]
// 如果非全局匹配:也先匹配3个数字【此示例涉及到了match的分组,详解看下面】
let str2 = "12345678";
let reg2 = /\d{1,3}(\d{3})*/
console.log(str2.match(reg2))
// ["123456", "456", index: 0, input: "12345678", groups: undefined]
// 如果有开头符号,也是先匹配3个数字
let str3 = "12345678";
let reg3 = /^\d{1,3}(\d{3})*/g
console.log(str3.match(reg3)) // ["123456"]
// 我们再来看看有$符时,\d{1,3}就会优先让(\d{3})*先匹配符合的数字,剩下的再由\d{1,3}匹配,这样\d{1,3}就不会先匹配了。
let str4 = "12345678";
let reg4 = /\d{1,3}(\d{3})*$/g
console.log(str4.match(reg4)) // ["12345678"]
// 匹配结果:["12345678"],345和678是(\d{3})*匹配到的,12是\d{1,3}匹配到的。
// 如果同时有开头符^和结束符$:还是先倒着匹配,即先看 (\d{3})* 再看\d{1,3}。这就是$符的特性
let str5 = "12345678";
let reg5 = /^\d{1,3}(\d{3})*$/g
console.log(str5.match(reg5)) // ["12345678"]
正则中()中代表的是组的含义;
// 示例1:结果中的456则是其中的第一个分组的值
let str2 = "12345678";
let reg2 = /\d{1,3}(\d{3})*/
console.log(str2.match(reg2))
// ["123456", "456", index: 0, input: "12345678", groups: undefined]
// 示例2
var str = 'Today is the 286th day of 2018, the 108th Thanksgiving Day.';
var results = str.match(/\d+(t)(h)/); //匹配str中首个以数字开头,并且以th结尾的子串
console.log(results); // ['286th', 't', 'h', index: 13, input: 'Today is the 286th day of 2018, the 108th Thanksgiving Day.', groups: undefined]
示例2分析:
由于该正则表达式为: /\d (t)(h) /,该表达式中使用了小括号(),在此处的作用为分组。所以match()的结果是带有分组特征的。返回的数组包含多个元素,第一个元素是以贪婪模式找到的最长的匹配,之后的元素依次为该匹配中的第一、第二、第三 …个分组匹配到的值,这里有2个分组,所以匹配到的值分别是"t" “h”。
注意:当正则表达式中有开始(^)或者结束($)符号时,则不会体现分组现象
例如:
let str5 = "12345678";
let reg5 = /^\d{1,3}(\d{3})*$/g
console.log(str5.match(reg5)) // ["12345678"]