2017-03-07 5 views
2

少なくとも1文字は含まれていますが、最初の文字は数字であってはいけません。私は一致してはならない。この最初の文字が数字ではない文字を含む文字列を一致させる

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 i ['^ \ d]'。 '/ \ A(?!\ d)。* [a-zA-Z]。* \ z/m'や'/\A(?! \ d).* \ p {L}。* \ z/m' –

+0

別の方法は 'str [0]です!〜/ \ d/&& str =〜/ [[:alpha] /#=> 4'(真実) –

答えて

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+文字を、含む行は
  • \p{L}/m修飾子が使用されている場合破る - 手紙を

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

2つの正規表現が許可された場合は、書くことができる:

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]]/) 
関連する問題