TCP标志验证正则表达式故障排查与修正求助
TCP标志验证正则解决方案
修正后的正则表达式
^(?:(?!.*(.).*\1)[AFPRSU]+|[1-9]\d*)$
正则说明
^和$:强制匹配整个输入字符串,彻底避免部分匹配(比如AFPx100这类混合非法字符的输入会被直接排除)- 双分支结构(用非捕获组
(?:...)包裹):- TCP标志分支:
(?!.*(.).*\1)[AFPRSU]+(?!.*(.).*\1):负前瞻断言,确保字符串中没有重复的标志字符(捕获任意一个标志后,检查后续是否存在相同字符)[AFPRSU]+:匹配1个或多个合法的TCP标志(仅允许大写A/F/P/R/S/U)
- 整数等效值分支:
[1-9]\d*[1-9]:确保整数以非零开头,避免前导零\d*:匹配后续任意数量的数字(支持1位或多位正整数)
- TCP标志分支:
原正则缺陷分析
- 部分匹配漏洞:原正则分支分别绑定
^和$,导致只要输入的开头或结尾匹配某一分支就会判定合法,比如AFPx100的开头AF匹配标志分支,直接通过验证。 - 重复检查不彻底:仅通过
(?!\1)检查相邻字符不重复,无法识别非相邻的重复标志(比如AFPA会被误判合法)。 - 字符范围不严谨:标志分支未限制只能是指定大写字符,整数分支的后顾
(?<![A-z])范围过大,且未限制结尾,导致100a这类非法输入漏判。
验证效果
- 合法输入全部匹配:
A、AFP、FPURA、18、1、40 - 非法输入全部排除:空值/空白、
AA、aFP、a100、100a、XFP
内容的提问来源于stack exchange,提问作者Jacob Barnes
相关产品推荐
相关产品推荐

