求符合指定规则的regex,实现type/tag开头行文本的精准分组捕获
正则解决方案
你原来的正则核心问题是没有对数字捕获组后的字符做严格限制,也没有把?和后续分组做绑定,导致非法格式被错误拆分匹配。
可用正则表达式
/^(type|tag):([^\\]*)?\\(\d{1,3})(?:\?([^:]*)?(?::([^:]*)?)?)?$/i
注:如果是在需要转义反斜杠的编程语言(如JavaScript、Java)中使用,需要把正则内的单个反斜杠替换为两个反斜杠,即:/^(type|tag):([^\\\\]*)?\\\\(\\d{1,3})(?:\\?([^:]*)?(?::([^:]*)?)?)?$/i
正则逻辑说明
^匹配行首,保证内容从行首开始符合规则(type|tag)捕获组1,匹配开头的type或tag:匹配固定的冒号分隔符([^\\]*)?捕获组2,匹配冒号后到反斜杠前的所有可选内容,无内容时返回空\\匹配规则要求必须存在的反斜杠(\d{1,3})捕获组3,严格匹配1-3位纯数字,为必填项(?:\?([^:]*)?(?::([^:]*)?)?)?整段为可选非捕获组,只有出现?时才会匹配后续内容:\?匹配必须存在的问号([^:]*)?捕获组4,匹配问号后到下一个冒号前的可选内容(?::([^:]*)?)?嵌套可选非捕获组,匹配冒号加后续的捕获组5可选内容
$匹配行尾,保证没有多余的非法字符
测试验证
- 合法输入
type:test\1?value12:value9:捕获结果符合预期,Group1=type、Group2=test、Group3=1、Group4=value12、Group5=value9 - 合法输入
type:\22?value62:value3:捕获结果符合预期,Group1=type、Group2=空、Group3=22、Group4=value62、Group5=value3 - 非法输入
type:\1p?hello:iii:数字后出现非?的字符p,整段匹配失败,符合拦截要求
内容的提问来源于stack exchange,提问作者user2203703
相关产品推荐
相关产品推荐

