接下来通过部分示例的应用,深入探讨正则表达式中的分组,希望能够帮助大家更好地理解和应用这一功能 。
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
非捕获分组的语法是
(?: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的数字
推荐阅读
- python正则一篇搞掂
- 重大线上事故!三元表达式引发的空指针问题
- C++进阶:纯虚函数和抽象类的奥秘
- 这款轻量级 Java 表达式引擎,真不错!
- 15 个常用的正则表达式技巧
- 职场进阶利器,探索四款隐藏的效率工具,让你事业腾飞
- Prometheus on k8s 部署与实战操作进阶篇
- 窝里有鱼泡却钓不到鱼的原因,钓鱼进阶秘诀
- 如何从菜鸟进阶钓鱼高手?把这些细节做好,你就是高手
- 夏季野钓自制窝饵配方,专攻大物,制作并不麻烦(进阶版)