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

时间:2017-03-07 23:15:41

标签: ruby regex string

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

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

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

"=" is matched even though it contains no letters. I expect the“a”to match, and similarly a string like“3 abcde”`不匹配。

2 个答案:

答案 0 :(得分:1)

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

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

/\A(?!\d).*[a-z]/im

甚至更快一点,对Unicode友好的版本:

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

请参阅regex demo

<强>详情:

  • \A - 字符串的开头
  • (?!\d) - 第一个字母不能是数字
  • \P{L}* - 除字母以外的0个或更多(*)个字符 或
  • .* - 任何0+字符,包括使用/m修饰符时的换行符)
  • \p{L} - 一封信

m修饰符使.能够匹配Ruby正则表达式中的换行符。

当您需要将字母限制为ASCII表格中的字母时,请使用[a-z]。此外,\p{L}可能会被[[:alpha:]]\P{L}替换为[^[:alpha:]]

答案 1 :(得分:0)

如果允许使用两个正则表达式,您可以写:

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

如果您希望truefalse返回,请将操作行更改为:

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

!!(str[0] !~ /\d/ && str =~ /[[:alpha]]/)