Perl正则如何区分必选与可选字符 实现指定规则字符串匹配
Perl正则匹配符合规则尖括号字符串的实现方案
原有正则/<[0-9,\s]+>/的问题本质是字符组规则仅约束了允许出现的字符范围,没有强制「必须包含至少1个数字」的必选条件,因此会误匹配全为空白、全为逗号的非法内容。通过Perl支持的零宽正向先行断言,可以在不消耗匹配字符的前提下完成必选规则校验,正确正则写法如下:
/<(?=[\s,]*[0-9])[0-9,\s]*>/
如果需要校验整个字符串完全符合规则(即字符串整体就是被尖括号包裹的目标内容,前后无其他字符),增加首尾锚点即可:
/^<(?=[\s,]*[0-9])[0-9,\s]*>$/
正则各段逻辑说明
<:匹配起始左尖括号,满足「以<开头」的规则(?=[\s,]*[0-9]):零宽正向先行断言,仅做规则校验、不占用匹配字符:校验<之后的位置,跳过任意数量(包含0个)的可选合法字符(空白、逗号)后,必须存在至少1位数字,从根源上排除无数字的非法匹配[0-9,\s]*:匹配<与>之间的所有内容,仅允许出现数字、半角逗号、空白字符三类,支持任意排列顺序、任意长度,满足可选字符规则>:匹配结束右尖括号,满足「以>结尾」的规则
注意:上述正则中
\s默认匹配Perl定义的全量空白字符(含半角空格、制表符、换行符、换页符等),如果业务仅允许半角空格作为合法空白,将正则中所有\s替换为半角空格即可。
匹配效果验证
可正常命中的合法场景
<9>:匹配成功<9,10>:匹配成功<9, 10>:匹配成功< 123 , 456 >:匹配成功(尖括号内侧带空白、数字与逗号间带空白均支持)<,7, 89 ,>:匹配成功(逗号出现在数字前后、多逗号均支持,只要存在数字即符合要求)
会被拦截的非法场景
< >:无数字,匹配失败<,>:无数字,匹配失败<a12>:包含非法字符a,匹配失败<12;34>:包含非法字符;,匹配失败<12:无闭合右尖括号,匹配失败
内容的提问来源于stack exchange,提问作者sda
相关产品推荐
相关产品推荐

