我遇到了一个问题,这个正则表达式用于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)}`)
);