正则表达式末尾可选分组匹配出多余捕获结果 求助正确写法
问题说明
将正则表达式末尾的分组设置为可选分组后,实际匹配时出现非预期的多余捕获结果,需要确认正确的正则写法。
当前使用的正则
<!([a-z]{0,25})\|([^\|>]*)\|([^\|<>]*)(\|([^\|<>]*))?>
测试用例文本
<!user|123|Kirill|{"color":"rgb(255, 184, 75)"}> published <!content|456|A cool content>
问题原因
多余捕获结果是正则捕获分组的默认机制导致的:你写的可选段外层(\|([^\|<>]*))?是普通捕获分组,只要是未特殊标记的括号分组,正则都会为其分配单独的捕获位,返回该分组匹配到的内容(未匹配时返回空值),这个额外的捕获位存的是带|前缀的完整可选段内容,就是你看到的多余结果。
修正方案
- 如果你不需要单独获取带
|前缀的完整可选段,只需要拿到可选段内的实际值,把外层可选分组改成非捕获分组即可,非捕获分组用(?:)包裹,不会生成额外捕获位。
修正后正则:
用该正则匹配时,捕获结果从左到右依次为:完整匹配的标签内容、标签类型、id字段、名称字段、可选的第四段字段,不会出现多余捕获项。<!([a-z]{0,25})\|([^\|>]*)\|([^\|<>]*)(?:\|([^\|<>]*))?> - 如果你确实需要获取带
|前缀的完整可选段内容,不需要修改正则,取匹配结果时跳过不需要的分组索引即可,该捕获项属于正常返回结果。
内容的提问来源于stack exchange,提问作者Valerii
相关产品推荐
相关产品推荐

