在正则表达式中设置最小和最大字符?

时间:2013-03-08 07:03:18

标签: java regex

我写了一个regular expression,它匹配任意数量的字母,字母之间有任意数量的单个空格。我希望这个正则表达式也能强制执行最小和最大数量的字符,但我不知道该怎么做(或者如果可能的话)。

我的正则表达式是:

[A-Za-z](\s?[A-Za-z])+

我意识到它只匹配一个空格周围的两组字母,所以我稍微修改它以修复它。最初的问题仍然是相同的。

有没有办法强制执行至少三个字符,最多三个字符?

4 个答案:

答案 0 :(得分:31)

就像+表示一个或多个你可以使用{3,30}来匹配3到30之间

例如[a-z]{3,30}匹配3到30个小写字母

来自documentation of the Pattern class

X{n,m}    X, at least n but not more than m times

在您的情况下,匹配3-30个字母后跟空格可以通过以下方式完成:

([a-zA-Z]\s){3,30}

如果你需要尾随空格,如果你不需要,你可以使用:(2-29次字母+空格,然后是字母)

([a-zA-Z]\s){2,29}[a-zA-Z]

如果您想要将空格数作为字符,则需要将该数字除以2才能获得

([a-zA-Z]\s){1,14}[a-zA-Z]

如果尾部空格是可选的,您可以将\s?添加到最后一个。这些都在RegexPlanet

上进行了测试

如果您希望整个字符串总共在3到30个字符之间,那么您可以在RegExp的开头使用前瞻添加(?=^.{3,30}$)并删除其他大小限制

所有这一切,老实说,我可能只是测试String的{​​{1}}财产。它更具可读性。

答案 1 :(得分:5)

这就是你要找的东西

^[a-zA-Z](\s?[a-zA-Z]){2,29}$

^是字符串

的开头

$是字符串

的结尾

(\s?[a-zA-Z]){2,29}会匹配(\ s?[a-zA-Z])2到29次..

答案 2 :(得分:3)

实际上Benjamin的回答将导致完整解决OP的问题。 使用前瞻可以限制字符总数并将匹配限制为一组字母和(可选)单个空格。

解决整个问题的正则表达式将成为

(?=^.{3,30}$)^([A-Za-z][\s]?)+$

这将匹配AAAA A,但也无法匹配AA A,因为有两个连续的空格。 我在http://regexpal.com/进行了测试,结果就是这样。

答案 3 :(得分:0)

你应该使用

[a-zA-Z ]{20}

[允许的字符] {限制字符数}