正则表达式进阶--玩转分组、前瞻和后顾( 二 )


接下来通过部分示例的应用,深入探讨正则表达式中的分组,希望能够帮助大家更好地理解和应用这一功能 。
1.基本分组语法使用小括号 () 来创建一个分组 。分组可以包含一个或多个字符 , 用于表示一个特定的模式 。例如,(abc) 表示一个由字符 "abc" 组成的模式 。
const str = "I love cats and dogs";const pattern = /(love cats)/;const result = str.match(pattern);console.log(result[0]); // 输出:"love cats"console.log(result[1]); // 输出:"love cats"2.捕获分组它允许我们在匹配过程中获取分组的值,并进行后续的处理 。捕获组可以通过索引或命名来引用 。
示例一:在一段字符串中取出其中的电子邮件地址const str = "My emAIl address is john@example.com";const pattern = /(w+@w+.w+)/;const result = str.match(pattern);console.log(result[0]); // 输出:"john@example.com"console.log(result[1]); // 输出:"john@example.com"在上述示例中,使用 (w+@w+.w+) 创建了一个分组 , 它匹配了电子邮件地址 , 并将其作为捕获组返回 。
示例二:在一段字符串中匹配并提取出其中的电话号码const str = "My phone number is (123) 456-7890";const pattern = /((d{3}))s(d{3})-(d{4})/;const result = str.match(pattern);console.log(result[0]); // 输出:"(123) 456-7890"console.log(result[1]); // 输出:"123"console.log(result[2]); // 输出:"456"console.log(result[3]); // 输出:"7890"在上述示例中,使用 ((d{3}))s(d{3})-(d{4}) 创建了三个分组,分别匹配了电话号码的区号、前三位和后四位,并将它们作为捕获组返回 。
示例三:搭配replace使用const str = "aaa,bbb,ccc";str.replace(/(w+),(w+),(w+)/, "$3,$2,$1");//输出'ccc,bbb,aaa'

  • $1代表第一个(w+)匹配到的内容 , 即aaa
  • $2代表第一个(w+)匹配到的内容 , 即bbb
  • $3代表第一个(w+)匹配到的内容 , 即ccc
3.非捕获分组非捕获分组是一种在正则表达式中使用的特殊语法,它允许我们创建一个分组(用括号包围的部分),但并不捕获该分组的结果 。这意味着该分组将只用于改变匹配的行为,而不会影响返回的匹配结果 。
非捕获分组的语法是(?:pattern),其中,pattern 是我们要匹配的模式
示例一:const regex = /(?:abc)/g;在这个例子中,(?:abc) 是一个非捕获分组 。这意味着正则表达式会尝试匹配 "abc",但不会将这个匹配结果保存下来 。因此 , 当我们使用 match() 或 search() 方法时,返回的结果将不包含这个非捕获分组的匹配结果 。
然而,非捕获分组仍然可以影响正则表达式的行为 。例如 , 它们可以用于改变匹配的优先级 , 改变单词边界的行为 , 或者简单地创建一种不需要被捕获的模式 。
示例二:匹配域名const str = "https://www.doorverse.com?v=123";const regex = /(?:http|https)://(?:[a-z]+.)+(?:[a-z]+)/i;const result = str.match(regex);console.log(result[0]); // 输出:"https://www.doorverse.com"在这个例子中 , 正则表达式尝试匹配以 "http://" 或 "https://" 开头的 URL , 但并不需要捕获这些前缀 。因此,这些前缀被放在了一个非捕获分组中 。同样,这个正则表达式也试图匹配一种形式的 URL,这个 URL的前缀是一种由字母组成的子域名字(例如 "google."),后面跟着的是顶级域名(例如 "com") 。这些都被放在了非捕获分组中 。这样做可以让正则表达式更加灵活,同时又不会影响到需要捕获的 URL 部分 。
4.反向引用分组反向引用使用 数字 的形式,其中数字表示先前捕获的分组的索引 。当使用反向引用时,正则表达式引擎会尝试匹配与先前捕获的内容相同的内容 。
示例一:匹配连续重复的字符const str = "abab";const pattern = /(w+)1/;const result = str.match(pattern);console.log(result[0]); // 输出:"abab"console.log(result[1]); // 输出:"ab"在上述示例中 , 使用 (w)1 创建了一个分组 , 并使用 1 后向引用来引用先前捕获的字符 , 从而匹配连续重复的字符 。
示例二:匹配类型为abab的数字


推荐阅读