如何编写至少包含一个字母的正则表达式,但第一个字符不能是数字?我试过这个
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”`不匹配。
答案 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
如果您希望true
或false
返回,请将操作行更改为:
str[0] !~ /\d/ && str =~ /[[:alpha]]/) ? true : false
或
!!(str[0] !~ /\d/ && str =~ /[[:alpha]]/)