设置正则表达式中的最小和最大字符数

2022-09-01 12:51:19

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

我的正则表达式是:

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

我意识到它只匹配了两组围绕单个空格的字母,所以我稍微修改了它以修复它。不过,最初的问题仍然是一样的。

有没有办法强制实施最少三个字符,最多30个字符?


答案 1

是的

“就像”表示一个或多个可用于在 3 和 30 之间匹配+{3,30}

例如,匹配 3 到 30 个小写字母[a-z]{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]

如果尾随空格是可选的,则可以添加到最后一个。这些都是在RegexPlanet上测试的\s?

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

总而言之,老实说,我可能只是测试的属性。它更具可读性。String.length


答案 2

这就是你要找的

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

^是字符串的开头

$是字符串的末尾

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