当前位置: 首页 > 工具软件 > Image-match > 使用案例 >

正则之match方法详解

漆雕誉
2023-12-01

使用

  1. match一般都要结合RegExp的全局g属性来使用的,这样返回的结果是:匹配到的所有结果的数组;
    let str1 = "12345678";
    let reg1 = /\d{1,3}(\d{3})*/g
    console.log(str1.match(reg1))  // ["123456", "78"]
  1. 如果不结合g使用,则在没有分组的情况下,只会返回一个匹配结果(或者没有匹配结果时返回null);
	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。
  1. . 如果不结合g使用,在有分组的情况下(还要没有开始(^)和结束($)符),则还会返回分组匹配到的内容,例如:
    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]

match中$符的特性

有$则先匹配末尾,与正则的从走到右,从外到内不同

// 没有$符时,\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"]

match的分组

正则中()中代表的是组的含义;

	// 示例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"]
 类似资料: