【问题标题】:Set minimum and maximum characters in a regular expression在正则表达式中设置最小和最大字符
【发布时间】:2013-02-23 16:10:55
【问题描述】:

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

我的正则表达式是:

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

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

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

【问题讨论】:

  • 任意数量的字母和任意数量的单个空格,最少 3 个字符,最多 30 个字符?听起来[A-Za-z ]{3,30} 会完成这项工作,因为它符合描述。
  • @nhahtdh 这将允许行中有多个空格。似乎没有优雅的解决方案。
  • 如果您陈述所有的要求,这是可能的。我只能从您的正则表达式中看到您对连续多个空格的要求,而不是您的描述。
  • "字母之间有任意数量的单个空格。"这意味着可以有任意数量的空格,只要它们是“单个空格”,即连续不超过一个空格。我试图明确说明这一要求,但我想这很难描述。
  • 这看起来像是一个规范的问题,但它已经相当晚了(2013 年),5 年了。

标签: java regex


【解决方案1】:

是的

就像+ 表示一个或多个你可以使用{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.length 属性。它更具可读性。

【讨论】:

  • @zvzdhk 我不明白你的问题,你想知道应该如何使用 {n,m} 量词的例子吗?
  • 是的,[a-z]{3,30} 匹配 3 到 30 个字母,但我的会匹配 3 到 30 组两个字母,它们之间可能有空格,而不是真正的字母。或者至少这就是玩 regexpal 似乎向我表明的。
  • @zvzdhk 很公平 :) 我刚刚编辑过,CorayThan 请看我的编辑。
  • 您的代码 sn-p 不起作用。如果我正确解决了 OP 的问题,aaaaaa bbbbbbb 也应该通过。但事实并非如此。
  • @zvzdhk 在这种情况下,他需要做的就是将 [a-zA-Z] 更改为 [a-zA-Z]+\s 。顺便说一句,感谢您帮助我改进我的答案。
【解决方案2】:

这就是你要找的东西

^[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()
  • 另外,^和$的实际用途是什么?至少在 java 中,我的匹配器似乎可以在没有这些的情况下工作。
  • @CorayThan 如果你使用上面没有 ^,$ 的正则表达式和 find 方法,它会匹配任何地方..所以它也会匹配任何超过 30 个字符的输入..如果您使用 matches 方法,它将完全匹配模式,因此如果您使用 match 方法,则不需要使用 ^,$ ..更多信息 here
  • @CorayThan 我想这已经解决了你的问题..如果这样你可以接受我的努力或至少为我的努力投票..对!
  • 我怀疑我的问题的真正答案是不可能的。就像我说的,计算空格时,字符串长度可以超过 30。
【解决方案3】:

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

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

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

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

【讨论】:

  • 谢谢。那个前瞻行动的例子正是我想要的。
【解决方案4】:

你应该使用

[a-zA-Z ]{20}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 2021-11-22
    相关资源
    最近更新 更多