How to use regex lookahead to limit the total length of input string

纵然是瞬间 提交于 2019-11-30 05:05:26

问题


I have this regular expression and want to add the rule which limit the total length is no more than 15 chars. I saw some lookahead examples but they're not quite clear. Can you help me to modify this expression to support the new rule.

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

回答1:


Actually, all this can be simplified a lot:

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

does exactly what you want. Or at least what your current regex does (plus the length restriction). This especially avoids problems with catastrophic backtracking which you're setting yourself up for when nesting quantifiers like that.

Case in point:

Try the string ABCDEFGHIJKLMNOP against your original regex. The regex engine will match that instantly. Now try the string ABCDEFGHIJKLMNOPa. It will take the regex engine nearly 230,000 steps to figure out it can't match the string. And each additional character doubles the number of steps needed to determine a failed match.




回答2:


Since you mentioned it in the title, a negative lookahead for your case would be:

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

Note the negative lookahead at the beginning (?!.{16,}) , that checks that the string does not have 16 or more characters.

However, as @TimPietzcker has pointed out your Regex can be simplified a lot, and re-written in such a form that is not prone to backtracking, so you should use his solution.




回答3:


^(?=.{15}$)([A-Z]+( )*[A-Z]+)+$

See it



来源:https://stackoverflow.com/questions/8246482/how-to-use-regex-lookahead-to-limit-the-total-length-of-input-string

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!