【问题标题】:Regular expression for letters, spaces and hyphens字母、空格和连字符的正则表达式
【发布时间】:2019-01-04 13:47:48
【问题描述】:

寻找允许字母(无论大小写)、空格和破折号在 ruby​​ 中进行验证的正则表达式。完全破解不了。

作为我使用的起点:

validates :name, format: { with: /\A[a-zA-Z]+(?: [a-zA-Z]+)?\z/, allow_blank: true}

非常感谢!

【问题讨论】:

  • 欢迎来到 SO。我怀疑这个问题已被否决,因为不清楚您要问什么。我可以推荐rubular.com 作为资源。您可以在 ruby​​ 中使用部分正则表达式的密钥(不同语言的正则表达式有不同的风格),并自己尝试一下。
  • /\A[-A-Z\s]+\z/i 就足够了。
  • 另外,“λ”是字母吗? “я”是字母吗? “ä”是字母吗?
  • 如果您需要支持所有 Unicode 字母,请确保 - 并且空格只出现在字母之间,并且不能出现连续的空格/连字符(并且可能有任意数量的空格/连字符),使用/\A\p{L}+(?:[- ]\p{L}+)*\z/
  • 到目前为止,在答案和 cmets 中,只有 @Wiktor 正确,因为不要求允许空格,只允许空格。假设str = "a\nb"。然后是str.match? /\A[-A-Z\s]+\z/i #=> true,这是不正确的,而str.match? /\A\p{L}+(?:[- ]\p{L}+)*\z/ #=> false。前者可以通过简单地将\s 更改为空格来限制为空格。我一次又一次地看到这个错误。

标签: ruby regex


【解决方案1】:

如果您需要支持所有 Unicode 字母并确保 - 并且空格仅出现在字母之间并且不能出现连续的空格/连字符(并且可能有任意数量的空格/连字符),请使用

/\A\p{L}+(?:[- ]\p{L}+)*\z/
/\A\p{L}+(?:[-\s]\p{L}+)*\z/
/\A\p{L}+(?:[-\p{Zs}\t]\p{L}+)*\z/

总之,

  • \A - 匹配字符串的开头
  • \p{L}+ - 一个或多个字母
  • (?:[-\s]\p{L}+)* - 匹配零次或多次出现的非捕获组
    • [-\s] - - 或空格
    • \p{L}+ - 一个或多个 Unicode 字母
  • \z - 字符串结尾。

请参阅regex demo

在 cmets 中,您提到 /\A[-A-Z\s]+\z/i 适合您,但它也匹配空白字符串或由连字符和空格混合而成的字符串,因为它表示“字符串开头、一个或多个 ASCII 字母、空格或连字符,然后是字符串的结尾”。这可用于只允许输入特定的字符,但这并没有太多验证。

【讨论】:

    【解决方案2】:

    此正则表达式将允许字母、空格和连字符:/\A[A-Za-z\s\-]+\z/

    【讨论】:

    • 小心,^$ 在 Ruby 中是 line 的开始/结束,而不是 string。你几乎总是想要\A\z
    猜你喜欢
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 2010-09-15
    • 2014-08-15
    • 2022-01-14
    相关资源
    最近更新 更多