JS正则如何匹配含&特殊字符的子串并捕获指定命名分组
JS正则匹配Section分组修正方案
原有正则匹配失败的核心问题:(?<section_1>\w+)仅支持匹配单个单词字符序列,遇到&就会终止,既没有覆盖后续重复的 & {word}结构,也未明确以|作为section_1的匹配终止边界。
可用正则
标准场景(匹配给出的3种固定格式)
/Section_1:\s*(?<section_1>\w+(?:\s*&\s*\w+)*)\s*\|\s*section_2:\s*(?<section_2>.*)/
兼容场景(支持section_2字段缺失的情况)
如果存在仅含Section_1、无后续|和section_2的输入,将后半段改为可选分组即可:
/Section_1:\s*(?<section_1>\w+(?:\s*&\s*\w+)*)(?:\s*\|\s*section_2:\s*(?<section_2>.*))?/
逻辑说明
Section_1:\s*:匹配Section_1:前缀及后续任意空白(?<section_1>\w+(?:\s*&\s*\w+)*):section_1命名分组\w+匹配Section_1后的第一个单词(如示例中的hello)(?:\s*&\s*\w+)*为非捕获分组,匹配0到多次「两侧带可选空白的& + 后续单词」结构,完全覆盖0个及以上& {word}拼接的需求
\s*\|\s*:匹配|分隔符及两侧空白,明确section_1的内容边界,不会越界匹配后续内容section_2:\s*:匹配section_2:前缀及后续空白(?<section_2>.*):捕获section_2后的所有剩余内容
匹配结果
三个测试用例的捕获结果完全符合预期:
- 输入
Section_1: hello & goodbye | section_2: kuku:section_1="hello & goodbye",section_2="kuku" - 输入
Section_1: hello & goodbye & hola | section_2: kuku:section_1="hello & goodbye & hola",section_2="kuku" - 输入
Section_1: hello | section_2: kuku:section_1="hello",section_2="kuku"
如果需要兼容Section前缀大小写不一致的场景,在正则末尾加i修饰符开启不区分大小写匹配即可。
内容的提问来源于stack exchange,提问作者MayAsk
相关产品推荐
相关产品推荐

