TCP标志的正则表达式



我遇到了一个问题,这个正则表达式用于TCP标志验证。

这是我目前的版本(我已经看过很多,都是错误的):

^([AFPRSU](?![0-9]))(?!1)|((?<![A-z])[1-9]+[0-9]*)$

因此,该值可以是TCP标志(A、F、p、R、S、U)的任意非重复组合,也可以是等效的整数。

:

A,
AFP,
FPURA,
18,
1,
40

无效的:

empty/null/whitespace,
AA,
aFP,
a100,
100a,
XFP

我当前的正则表达式的问题是前视/后视只检查一个字符+/-所以AFPx100将是一个有效值,因为"F"后"A"是有效的。我在不同的迭代中也遇到过类似的问题,但最终都归结为无知。我一直在regexr.com上尝试和错误,但没有真正得到任何东西,到目前为止大约8个小时的努力。

我很不幸地被绑定到正则表达式,否则我会用另一种方式解决这个问题。在这一点上,我迫切需要任何指示/建议。谢谢。

使用锚匹配整个字符串,您可以从[AFPRSU]中匹配一个或多个字符,或者从数字1-9开始的1个或多个数字,以便空字符串也不匹配:

^(?:(?![AFPRSU]*([AFPRSU])[AFPRSU]*1)[AFPRSU]+|[1-9]d*)$

  • ^起始字符串
  • (?:2个备选项的非捕获组
    • (?![AFPRSU]*([AFPRSU])[AFPRSU]*1)负向前看,断言字符串
    • 中列出的相同字符不是2个
    • [AFPRSU]+匹配1+倍列出的字符
    • |
    • [1-9]d*匹配数字1-9后面跟着可选数字
  • )关闭非捕获组
  • $字符串结束

查看正则表达式演示。

const regex = /^(?:(?![AFPRSU]*([AFPRSU])[AFPRSU]*1)[AFPRSU]+|[1-9]d*)$/;
[
"A",
"AFP",
"FPURA",
"18",
"1",
"40",
"",
" ",
"AA",
"aFP",
"a100",
"100a",
"XFP"
].forEach(s =>
console.log(`"${s}" --> ${regex.test(s)}`)
);

最新更新