9

我有这个正则表达式,想添加限制总长度不超过 15 个字符的规则。我看到了一些前瞻的例子,但它们不是很清楚。你能帮我修改这个表达式以支持新规则吗?

^([A-Z]+( )*[A-Z]+)+$
4

3 回答 3

13

由于您在标题中提到它,因此您的案例的负面展望将是:

^(?!.{16,})(regex goes here)+$

请注意开头的否定前瞻(?!.{16,}),它检查字符串是否包含 16 个或更多字符。

但是,正如@TimPietzcker 指出的那样,您的正则表达式可以简化很多,并以不易回溯的形式重新编写,因此您应该使用他的解决方案。

于 2011-11-23T17:30:01.013 回答
11

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

^[A-Z][A-Z ]{0,13}[A-Z]$

做你想要的。或者至少你当前的正则表达式做了什么(加上长度限制)。这尤其避免了在嵌套量词时遇到的灾难性回溯问题。

一个例子:

尝试ABCDEFGHIJKLMNOP针对您的原始正则表达式的字符串。正则表达式引擎将立即匹配。现在试试字符串ABCDEFGHIJKLMNOPa。正则表达式引擎需要将近230,000步才能确定它无法匹配字符串。每个额外的字符都会使确定失败匹配所需的步骤数加倍。

于 2011-11-23T18:40:51.127 回答
9
^(?=.{15}$)([A-Z]+( )*[A-Z]+)+$

看见

于 2011-11-23T17:31:06.053 回答