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

31
我是一名能够提供文本翻译的助手。

我已经写了一个正则表达式,它可以匹配任意数量的字母以及字母之间的任意数量的单个空格。我想让这个正则表达式还能够强制规定最小和最大字符数,但我不确定如何实现(或者是否可行)。

我的正则表达式是:

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

我意识到它只匹配单个空格周围的两组字母,所以我稍微修改了一下以解决这个问题。但原始问题仍然没有改变。
有办法强制限制字符数在3到30之间吗?

任意数量的字母,带有任意数量的单个空格,最少3个字符,最多30个字符?看起来[A-Za-z ]{3,30}可以胜任此工作,因为它符合描述。 - nhahtdh
@nhahtdh 这将允许在一行中有多个空格。看起来没有优雅的解决方案。 - CorayThan
如果您列出所有要求,那么是有可能的。我只能从您的正则表达式中看到多个空格的要求,而不能从您的描述中看到。 - nhahtdh
“with any number of single spaces between the letters.” 这句话的意思是可以有任意数量的空格,只要它们是“单个空格”,即不超过一个空格。我试图明确说明这个要求,但我想这可能很难描述清楚。 - CorayThan
这似乎是一个经典问题,但已经相当晚了(2013年),已经过去了5年。 - Peter Mortensen
一个更一般的“问题”是*参考-这个正则表达式是什么意思?*。它有“最小/最大范围(全包含)”。 - Peter Mortensen
4个回答

45

是的

就像+代表一个或多个,你可以使用{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个字符之间,则可以使用前瞻,在RegExp开头添加(?=^.{3,30}$)并删除其他大小限制。

话虽如此,老实说我可能只会测试String.length属性。这样更易读。


@zvzdhk,我不明白你的问题,你需要关于{n,m}量词如何使用的示例吗? - Benjamin Gruenbaum
1
是的,[a-z]{3,30} 匹配 3 到 30 个字母,但我的匹配的是 3 到 30 组两个字母,中间可能有空格,而不是真正的字母。至少在使用 regexpal 进行测试时是这样的。 - CorayThan
@zvzdhk 好的,没问题 :) 我刚刚编辑了一下,CorayThan请看一下我的修改。 - Benjamin Gruenbaum
你的代码片段不起作用。如果我正确理解了 OP 的问题,aaaaaa bbbbbbb 也应该被通过。但实际上它并没有。 - bsiamionau
我想要任何字符或任何东西,但长度必须为8。如何实现? - Irfan Nasim
显示剩余6条评论

9

这就是你在寻找的内容。

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

^ 表示字符串的开头

$ 表示字符串的结尾

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


这已经非常接近了。我实际上想要\s?而不是\s*,因为我只想要最多一个空格。唯一的问题是我希望空格包括在字符计数中。我正在考虑将"(myString.length() > 2 && myString.length() < 31)"的等效内容纳入我的正则表达式中,这样我就不需要在Java中进行额外的检查了。 - CorayThan
此外,“^”和“$”有什么实际用途?至少在Java中,我的匹配器似乎可以不使用它们。 - CorayThan
@CorayThan 如果您使用上述正则表达式而不带有^,$,那么它将匹配任何地方..因此它也将匹配任何具有超过30个字符的输入..如果您使用matches方法,它将完全匹配模式,因此您不需要使用^,$ 如果您使用matches方法..更多信息在这里 - Anirudha
@CorayThan 我猜这解决了你的问题..如果是的话,你可以接受答案或者至少点赞以表对我的努力的认可..对吧! - Anirudha
@CorayThan 你可以分开做...为什么要只用正则表达式呢...那不是有点过度kill了吗 - Anirudha
显示剩余3条评论

5

实际上,Benjamin的回答将会给出完整的解决方案,使用先行断言可以限制总字符数,并将匹配限制在一组字母和(可选)单个空格的组合中。

解决整个问题的正则表达式会变成:

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

这将匹配AAAA A,但无法匹配AA A,因为有两个连续的空格。
我在http://regexpal.com/测试过,它可以解决问题。

谢谢。那个前瞻示例正是我所需要的。 - Dan Solo

0

你应该使用

[a-zA-Z ]{20}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接