2017-03-07 39 views
2

如何編寫至少包含一個字母但第一個字符不能是數字的正則表達式?我想這匹配包含字母的字符串,其中第一個字符不是數字

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 「一」 to match, and similarly a string like 「3abcde」`應該不匹配。

+1

' [az] *'和'[[:space:]] *'可以匹配空字符串,'='不是數字,匹配w ith'[^ \ d]'。試試'/ \ A(?!\ d)。* [a-zA-Z]。* \ z/m'甚至是'/\A(?!\d).*\p{L}.*\z/m' –

+0

另一種方式是'str [0]!〜/ \ d/&& str =〜/ [[:alpha] /#=> 4'(truthy) –

回答

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正則表達式中的換行符。

使用[a-z]當您需要將字母限制在ASCII表中的字符時。另外,\p{L}可以用[[:alpha:]]\P{L}[^[:alpha:]]替代。

+1

您可不寫'/ \ A(?!\ d)。* [az]/im'或可能更快)'/ \ A(?!\ d)。*?[az]/im'? –

+1

@CarySwoveland你是對的。這個答案包括一些冗餘。但我不認爲貪婪的比賽會更快。 – sawa

+0

@sawa,你是不是非貪心? –

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]]/) 
相關問題