28

我写了一个正则表达式,它匹配任意数量的字母,字母之间有任意数量的单个空格。我希望该正则表达式也强制执行最小和最大字符数,但我不确定如何执行此操作(或者是否可能)。

我的正则表达式是:

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

我意识到它只匹配围绕一个空格的两组字母,所以我稍微修改了它来解决这个问题。原来的问题仍然是一样的。

有没有办法强制至少三个字符和最多 30 个字符?

4

4 回答 4

43

是的

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

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

来自Pattern 类的文档

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 个字符之间,您可以使用(?=^.{3,30}$)在 RegExp 开头添加的前瞻并消除其他大小限制

说了这么多,老实说,我可能只是测试String'.length属性。它更具可读性。

于 2013-03-08T07:04:02.130 回答
7

这就是你要找的

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

^是字符串的开头

$是字符串的结尾

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

于 2013-03-08T07:13:16.077 回答
4

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

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

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

这将匹配AAA,并且由于有两个连续的空格,A A因此也无法匹配。AA A我在http://regexpal.com/上对此进行了测试,它成功了。

于 2013-11-04T14:22:52.180 回答
1

你应该使用

[a-zA-Z ]{20}

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

于 2015-07-10T11:13:41.383 回答