正则表达式 分组与非捕获组

参考资料

  1. 初心者歓迎!手と目で覚える正規表現入門・その2「微妙な違いを許容しつつ置換しよう」


一. 分组

⏹语法:()

⏹作用:同时匹配多块内容,方便引用,捕获,提取对应的内容

👇👇👇有如下所示的文本👇👇👇

<select name="fruit_console">
	<option value="apple">苹果</option>
	<option value="banana">香蕉</option>
	<option value="orange">橘子</option>
	<option value="none"></option>
</select>

1.1 分组获取属性值和标签文本

⏹同时从文本中获取出

  • value对应的属性值
  • 标签的文本值

需要分为两个组

  • value属性值
  • 标签文本组

<option value="(\w+)">(.+)<\/option>

  • 通过(\w+)(.+) 来分别匹配 value属性值 和 标签的文本值并分组
  • 由于我们使用 (.+) ,而不是 (.*) 来匹配标签的文本值,所以没有文本值的<option value="none"></option>不会被匹配到

在这里插入图片描述

1.2 分组获取属性值和标签文本,转换CSV格式

⏹要求将匹配到的内容转换为如下格式

苹果,apple
香蕉,banana
橘子,orange

⏹如下图所示,$1$2 代表我们分的两个组所对应的值

在这里插入图片描述

1.3 分组取别名

1.3.1 语法

⏹在默认情况下

  • $0:表示整个正则表达式匹配的字符串
  • $1:表示第一个捕获组
  • $2:表示第二个捕获组

⏹在正则表达式中有多个分组的时候,使用默认的分组名称,可读性很低。
这个时候,我们可以给分组取别名,提高可读性。

⏹语法:(?<分组别名>pattern)

1.3.2 效果展示

<option value="(?<Value值>\w+)">(?<元素值>.+)<\/option>

  • 通过?<Value值>取别名
  • 通过?<元素值>取别名

在这里插入图片描述

1.3.3 JavaScript分组取别名,提取信息

<body>
    <select name="fruit_console">
        <option value="apple">苹果</option>
        <option value="banana">香蕉</option>
        <option value="orange">橘子</option>
        <option value="none"></option>
    </select>
</body>
<script>
    // 获取元素的html字符串
    const selectTagHtmlStr = document.querySelector("select[name='fruit_console']").outerHTML;
    console.log(selectTagHtmlStr);
    console.log('----------------------------------');

    // 定义正则表达式,包含命名捕获组
    const regex = /<option value="(?<Value值>\w+)">(?<元素值>.+)<\/option>/g;

    // 使用 matchAll 方法获取所有匹配的结果
    const matches = selectTagHtmlStr.matchAll(regex);

    // 遍历所有匹配结果,提取命名捕获组的值
    for (let match of matches) {
        console.log(`Value值: ${match.groups['Value值']}`);
        console.log(`元素值: ${match.groups.元素值}`);
        console.log('----------------------------------');
    }
</script>

在这里插入图片描述


二. 非捕获组

2.1 语法

⏹语法:(?:...)

⏹作用:只分组而不捕获,用来辅助匹配,不会将结果放入存储空间,可以提高匹配速度。

2.2 遇到的问题

  • 我们的html文本中多了一个selected属性
<select name="fruit_console">
	<option value="apple" selected>苹果</option>
	<option value="banana">香蕉</option>
	<option value="orange">橘子</option>
	<option value="none"></option>
</select>

😵如果我们还是使用之前的<option value="(?<Value值>\w+)">(?<元素值>.+)<\/option>正则表达式来匹配的话
会发现苹果无法被匹配到,因为多了一个selected属性。

在这里插入图片描述

由于多了一个selected属性,且该属性并不是所有的option标签都存在,我们可以写出下面的正则表达式来匹配
<option value="(\w+)"(\s+selected)?>(.+)<\/option>

  • 🤪为了简化,没有给分组命名
  • (\s+selected)?
    • 并不是所有的option都有selected属性,所以添加了?
    • 如果selected属性存在的话,在前面会有一个空格,所以添加了\s+

😵但是随之而来的,会遇到下面的问题,
可以看到,selected所在的辅助匹配的组,也参与了分组匹配。。。
在这里插入图片描述

2.3 非捕获组解决问题

⏹通过下面的正则表达式进行匹配
<option value="(\w+)"(?:\s+selected)?>(.+)<\/option>

  • (?:\s+selected)?中的?:用于标识selected只是参与辅助匹配,并不会将结果反映到分组匹配结果中

在这里插入图片描述

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值