Ruby 匹配包含第一个字符不是数字的字母的字符串

Ruby 匹配包含第一个字符不是数字的字母的字符串,ruby,regex,string,Ruby,Regex,String,如何编写至少有一个字母但第一个字符不能是数字的正则表达式?我试过这个 str = "a" str =~ /^[^\d][[:space:]]*[a-z]*/i # => 0 str = "=" str =~ /^[^\d][[:space:]]*[a-z]*/i # => 0 “=”即使不包含字母,也会匹配。我希望“a”匹配,类似于“3abcde”`这样的字符串也不应该匹配。和[a-z]*和[[:space:]]*模式可以匹配空字符串,因此在需要验证时它们实际上没有任何区别。

如何编写至少有一个字母但第一个字符不能是数字的正则表达式?我试过这个

str = "a"
str =~ /^[^\d][[:space:]]*[a-z]*/i
# => 0 

str = "="
str =~ /^[^\d][[:space:]]*[a-z]*/i
# => 0 

“=”即使不包含字母,也会匹配。我希望
“a”
匹配,类似于
“3abcde”`这样的字符串也不应该匹配。

[a-z]*
[[:space:]]*
模式可以匹配空字符串,因此在需要验证时它们实际上没有任何区别。另外,
=
不是数字,它与使用模式类型的
[^\d]
否定字符类匹配。这意味着它需要字符串中数字以外的字符

您可以依赖于将限制字符串开始位置的前瞻:

/\A(?!\d).*[a-z]/im
甚至更快一点的Unicode友好版本:

/\A(?!\d)\P{L}*\p{L}/

详细信息

  • \A
    -字符串的开头
  • (?!\d)
    -第一个字符不能是数字
  • \P{L}*
    -0个或更多(
    *
    )字符,而不是字母

  • *
    -任何0+字符,包括使用
    /m
    修饰符时的换行符)
  • \p{L}
    -一封信
m
修饰符允许
匹配Ruby正则表达式中的换行符


当您需要仅将字母限制为ASCII表中的字母时,请使用
[a-z]
。另外,
\p{L}
可以替换为
[:alpha:]
,而
\p{L}
可以替换为
[^[:alpha:]
,如果允许使用两个正则表达式,则可以编写:

def pass_de_test?(str)
  str[0] !~ /\d/ && str =~ /[[:alpha]]/
end

pass_de_test?("*!\n?a>") #=> 4 (truthy)
pass_de_test?("3!\n?a>") #=> false
如果要返回
true
false
,请将操作行更改为:

str[0] !~ /\d/ && str =~ /[[:alpha]]/) ? true : false


[a-z]*
[[:space:][]*
可以匹配空字符串,并且
=
不是数字,它与
[^\d]
匹配。试试
/\A(?!\d.*[A-zA-Z].\Z/m
甚至
/\A(?!\d.*\p{L}.*\Z/m
另一种方法是
str[0]!~/\d/&&str=~/[:alpha]]/#=>4
(truthy)你不能写
/\A(?!\d)。*[A-z]/im
或者(可能更快)
/\A(?!\d)。*?[A-z]/im
?@CarySwoveland你是对的。这个答案包括一些冗余。但我不认为贪婪的比赛更快。@sawa,你是说不贪婪吗?@CarySwoveland对。你明白了。谢谢,我被OP中提到的匹配输入长度问题误导了一点,因此我把注意力集中在了两个锚上。我“修剪”了解决方案。
!!(str[0] !~ /\d/ && str =~ /[[:alpha]]/)