首页 > 解决方案 > 字母、空格和连字符的正则表达式

问题描述

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

作为起点,我正在使用:

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

非常感谢!

标签: rubyregex

解决方案


如果您需要支持所有 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- 字符串的结尾。

请参阅正则表达式演示

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


推荐阅读