Ruby中name的正则表达式

Ruby中name的正则表达式,ruby,regex,Ruby,Regex,我知道这个问题已经被问了很多,但我需要一个用于名称验证的正则表达式 唯一的要求是字母可以,没有数字,没有2以外的特殊字符,空格不能在开头或结尾,也允许使用-和`字符。其他一切都是无效的 所有其他答案似乎要求更多,似乎变得太复杂 目前我正在使用 /^([^\d\W]|[-])*$/ 但这在空间上是失败的 样本数据: 通过: 失败: 以下正则表达式应过滤字母、除一个空格、破折号和反勾号以外的任何特殊字符,并且不过滤数字: /^[a-zA-Z\-\`]++(?: [a-zA-Z\-\`]++)?$/

我知道这个问题已经被问了很多,但我需要一个用于名称验证的正则表达式

唯一的要求是字母可以,没有数字,没有2以外的特殊字符,空格不能在开头或结尾,也允许使用-和`字符。其他一切都是无效的

所有其他答案似乎要求更多,似乎变得太复杂

目前我正在使用

/^([^\d\W]|[-])*$/
但这在空间上是失败的

样本数据:

通过:

失败:


以下正则表达式应过滤字母、除一个空格、破折号和反勾号以外的任何特殊字符,并且不过滤数字:

/^[a-zA-Z\-\`]++(?: [a-zA-Z\-\`]++)?$/

希望有帮助

我假设一个字符串有效,它可能只包含大小写字母、撇号、破折号和最多两个空格,前提是空格不在字符串的开头或结尾

STR= "-a-z'"

r = /
    \A           # match beginning of string
    (?:          # begin non-capture group
      [#{STR}]+  # match 1+ letters, "-" or "'"
      |          # or
      [#{STR}]+\s[#{STR}]*\s?[#{STR}]+
                 # match 1+ letters, "-" or "'", space, 0+ letters, "-" or "'",
                 # optional space, 1+ letters, "-" or "'"
    )            # end non-capture group
    \z           # match end of string
    /ix          # case-indifferent and free-spacing regex definition modes
      #=> /
          \A           # match beginning of string
          (?:          # begin non-capture group
            [-a-z']+   # match 1+ letters, "-" or "'"
            |          # or
            [-a-z']+\s[-a-z']*\s?[-a-z']+
                       # match 1+ letters, "-" or "'", space, 0+ letters, "-" or "'",
                       # optional space, 1+ letters, "-" or "'"
          )            # end non-capture group
          \z           # match end of string
          /ix 
如果我没有使用自由间距模式来定义正则表达式,它将如下所示:

r = /\A(?:[-a-z']+|[-a-z']+\s[-a-z']*\s?[-a-z']+)\z/i 

"a B-' v"    =~ r #=> 0
"aB-'v"      =~ r #=> 0
"aB-'1v"     =~ r #=> nil
"a B-'1  v"  =~ r #=> nil
" a B-1v"    =~ r #=> nil 
如果希望返回true或false,而不是truthy值0或falsy值nil,则可以编写以下代码,例如:

("a B-' v" =~ r) ? true : false #=> true
还是骗局

!!("a B-' v" =~ r) #=> true
后者之所以有效,是因为它与:

!(!("a B-' v" =~ r))
  #=> !(!(0)) => !(false) => true
问题要求使用正则表达式验证名称。使用正则表达式可能是最好的,但它不是唯一的方法。如果问题真的是如何使用正则表达式或其他方法验证名称,那么应该以不规定特定方法的方式进行说明。这里有一种不用正则表达式进行验证的方法

GOOD_CHARS = ('a'..'z').to_a.join << "'-"
  #=> "abcdefghijklmnopqrstuvwxyz'-"

def validate(str)
  return false if str.empty? || (str[0]==' ' || str[-1]==' ')
  nbr_spaces = str.count(' ')
  return false if nbr_spaces > 2 
  str.downcase.count(GOOD_CHARS) + nbr_spaces == str.size
end

validate "a B-' v"   #=> true
validate "aB-'v"     #=> true
validate "aB-`1v"    #=> false 
validate "a B-'1  v" #=> false 
validate " a B-'1v"  #=> false 

谢谢你,我一回到电脑前就会试试,不过我老板认为应该有两个空间。你能把它改成两个空格吗?改变问题中的标准,而不是评论中的标准。在评论中添加附加信息会迫使人们尝试帮助阅读每一条评论,并尝试将其按顺序排列。请阅读。我们需要更多的数据。提供示例名称和预期输出。否则,我们将被迫尝试解释您的示例,并在此基础上构建示例数据,这将浪费我们的时间,并增加回答不符合您需要的答案的机会。@thetinman抱歉,没有不尊重您的意思,您的意思是“代替”吗?这也是一个非常重要的问题,因为不仅口音很常见,还允许使用其他字符。名字像这样的人确实存在。我看到你把要求改为最多两个空格,而不是一个。你不应该在答案发布后改变问题的实质内容,因为这可能会导致答案不正确或不合情理,结果可能会被否决。好的,这一次,我们将修正我们的答案,但您需要更清楚地了解需求。字符串能否以一个或两个空格开头或结尾?如果有两个空间,它们必须相邻吗?请通过编辑澄清。对不起,我在评论中更改了要求,有人建议我在问题中更改了要求,所以我这样做了。我不想惹大家生气,只是想得到一个答案,我会编辑这个问题,这样空间就不会在之前或之后出现。再次为糟糕的礼节感到抱歉,我正在尝试您的解决方案,但当我将其插入时,它似乎没有捕获任何内容。谢谢你对每一件作品的解释,但它在使用时似乎没有名字?我不明白。你在评论中链接的正则表达式不是我建议的。你试过在IRB中运行我的代码吗?我刚刚发布了我以前使用的网站。我插入了你的regex\A?:[{STR}]+|[{STR}]+\s[{STR}]+\z,它说不匹配。因此,我认为它不起作用,还是\A?:[-A-z`']+|[-A-z`]\s[-A-z`']+\z/ix,但两者都不起作用我只是修改了解决方案,允许一个或两个空格不一定在一起,如果两个空格不在开头或结尾的话。你想在STR被替换掉后使用我的正则表达式r。您可以看到正则表达式适用于我考虑的五个字符串。在你的链接上试试那些字符串。我只是注意到你希望允许的是单引号,而不是倒勾!我会调整的。
!(!("a B-' v" =~ r))
  #=> !(!(0)) => !(false) => true
GOOD_CHARS = ('a'..'z').to_a.join << "'-"
  #=> "abcdefghijklmnopqrstuvwxyz'-"

def validate(str)
  return false if str.empty? || (str[0]==' ' || str[-1]==' ')
  nbr_spaces = str.count(' ')
  return false if nbr_spaces > 2 
  str.downcase.count(GOOD_CHARS) + nbr_spaces == str.size
end

validate "a B-' v"   #=> true
validate "aB-'v"     #=> true
validate "aB-`1v"    #=> false 
validate "a B-'1  v" #=> false 
validate " a B-'1v"  #=> false