如何使用正则表达式前瞻来限制输入字符串的总长度

Aus*_*nTX 6 regex expression limit lookahead

我有这个正则表达式,并希望添加限制总长度不超过15个字符的规则.我看到了一些前瞻性的例子,但它们并不十分清楚.你能帮我修改一下这个表达式来支持新规则.

^([A-Z]+( )*[A-Z]+)+$
Run Code Online (Sandbox Code Playgroud)

Ric*_*lly 11

既然你在标题中提到它,你的案例的负面预测将是:

^(?!.{16,})(regex goes here)+$
Run Code Online (Sandbox Code Playgroud)

请注意开头的负向前瞻(?!.{16,}),检查字符串是否没有16个或更多字符.

但是,正如@TimPietzcker指出的那样,你的正则表达式可以简化很多,并且以不容易回溯的形式重写,所以你应该使用他的解决方案.


Tim*_*ker 11

实际上,所有这些都可以简化很多:

^[A-Z][A-Z ]{0,13}[A-Z]$
Run Code Online (Sandbox Code Playgroud)

完全符合你的要求.或者至少你当前的正则表达式(加上长度限制).这尤其避免了灾难性回溯的问题,当你像这样嵌套量词时,你正在为自己做好准备.

例证:

尝试使用ABCDEFGHIJKLMNOP原始正则表达式的字符串.正则表达式引擎会立即匹配.现在尝试字符串ABCDEFGHIJKLMNOPa.这将需要正则表达式引擎将近230,000步,以确定它不能匹配字符串.并且每个附加字符使确定失败匹配所需的步骤数加倍.