2016-04-29 7 views
4

正規表現と10進数の数値を一致させる必要があります。現在、私は/^-?[0-9]\d*(.\d+)/持っているが、それは私が数値と小数の正規表現を一致させる

現在有効なことを解決するだろうか.00 を考慮していない:

1 
1.0 
1.33 
.00 

現在無効:

Alpha Character 
+1

を試すには、希望のマッチのサンプルを投稿してくださいことはできますか? –

+0

私はあなたには ''/\A-?¥d*\.?¥d+\z/'](http://rubular。com/r/YIN40sgxUz)。 '4.'文字列にもマッチする必要がありますか? –

+0

文字列の一致部分(例:「2.1杯追加」)、または文字列全体を構成する必要がありますか? –

答えて

5

あなたは(整数部なし小数部分と番号なしの数字)二つの可能性を処理する必要があります。

/\A-?(?:\d+(?:\.\d*)?|\.\d+)\z/ 
#^ ^^   ^^  ^---- end of the string 
#| | |   |'---- without integer part 
#| | |   '---- OR 
#| | '---- with an optional decimal part 
#| '---- non-capturing group 
#'---- start of the string 

を、またはすべてのオプションを作成してありますことを確認、少なくとも1桁:

/\A-?+(?=.??\d)\d*\.?\d*\z/ 
#^^^  ^---- optional dot 
# | | '---- optional char (non-greedy) 
# | '---- lookahead assertion: means "this position is followed by" 
# '---- optional "-" (possessive) 

注:私は整数部分の数値がより頻繁であると信じているので、非貪欲量限定子??を使用しましたが、それは誤った仮定になる可能性があります。この場合、それを欲張り量限定器?に変更します。 ( "unknow char"に使用する量指定子の種類は問わず、結果は変わりません)

1

最初の部分がオプションである場合は、 `とそのようにオフにマークすることができます(?:...)?:

/\A(?:-?[0-9]\d*)?(.\d+)/ 

?: beginは、これがキャプチャしていないグループであることを示しているため、あなたが突きつけようとしている部分に干渉することはありません。

0

単純な場合はどうですか:/\d*\.?\d*/

+2

このパターンは、ユニバースのすべての文字列で成功します。 *(空文字列と一致するため、すべてがオプションです)*。 –

+0

どういう意味ですか? '\ d'は例えば数字だけと一致します。私はそれも単純な '.'と一致することに同意しますが、これはOPが望んでいるものの唯一の例外です、そうではありませんか?それは例えば 'test'とは一致しません...あなたが示唆しているのはそうだと思います。 – Uzbekjon

+0

実際には 'test' *と一致しません(最初の" t "位置の空文字列と一致するため)*、しかし' test'で成功します。 –

0

、この場合には、3を照合する変種で正規表現を作成します。

N 
N.NN 
.NN 

すなわち:私は^\-?[0-9\.]+のようなものを使用することになり

(\d+\.\d+|\d+|\.\d+) 

regex 101 Demo

+0

これは、小数点なしの数値(例:1)をキャッチしません。 – Awesominator

+0

私はOPがそれを必要としていることを知らなかった!彼はその間に質問を更新しました... –

+0

@Awesominator私は私の答えを更新しました、これを私の注意に持ってくれてありがとう! –

0

またはラインの特定の部分だけをキャプチャする場合は、(^\-?[0-9\.]+)です。これにより、数字の09と小数点(.)の任意の組み合わせが、行頭にダッシュ(-)で始まるオプション付きで検索されます。

Rubularは、正規表現でテストして遊ぶのに最適な場所です。

0

これは別のアプローチです。

def match_it(str) 
    str if str.gsub(/[\d\.-]/, '').empty? && Float(str) rescue nil 
end 

match_it "1"  #=> "1" 
match_it "1.0" #=> "1.0" 
match_it "-1.0" #=> "-1.0" 
match_it "1.33" #=> "1.33" 
match_it ".00" #=> ".00" 
match_it "-.00" #=> "-.00" 
match_it "1.1e3" #=> nil 
match_it "Hi!" #=> nil 
0

これは役に立ちます。 :

(^-?[\d+]*[\.\d+]*)

だけ:)

+0

小数点以下1桁までです。[/^- ?[\ d +] * [\。\ d +] * /]#=> "1 ....." 'また、あなたは '[\ d] *'を意味しないのですか? –

関連する問題