2013-11-22 20 views
5

カンマ区切りを含む10進数に適切な正規表現を見つけるのが難しいです。Regexカンマで10進数を

私は、一般的にはこの問題について、いくつかの他の質問を見つけましたが、答えのどれも本当に私は彼らに

を試験したとき、私がこれまで持って最善のは働いていない:

[0-9]{1,3}(,([0-9]{3}))*(.[0-9]+)? 

2の主要な問題そうfar:

1)「3001」を2つの「3001」「1」に分割するのではなく、「3001 1」の間にスペースを入れて数字を記録します。

2)正規表現の先頭と末尾には一般的な問題があります。

正規表現は一致する必要があります:

3,001 
1 
32,012,111.2131 

でもないが:

32,012,11.2131 
1132,012,111.2131 
32,0112,111.2131 
32131 

を加えて、私はそれが一致したいと思います。で

1.(without any number after it) 
1,(without any number after it) 
as 1 

(カンマまたはポイント番号の最後は見落とされるはずです)。

多くのありがとうございます! 。

+0

あなたの言語の正規表現ライブラリがすでにそうしているのでなければ、おそらく両端にパターンを固定する必要があります。それ以外の場合は、少なくとも1桁の文字列が一致します。 – cHao

+0

あなたは、任意の文字にマッチするピリオド( '' '.''')で正規表現のスペースを許可しました。ピリオド( '' \ .''')をエスケープすると、ピリオドだけが一致します。 – creemama

+0

2番目と3番目の問題はまったく問題ではないと私は思います。私が言うことから、彼らは彼らが想定していないものと一致しません。 –

答えて

2

これは非常に長く畳み込まれた正規表現で、すべての要件に適合します。あなたのregexエンジンがPCRE(PHP、Delphi、R ..のいずれかを使用しているとうまくいけば)に基づいていればうまくいくでしょう。

(?<=[^\d,.]|^)\d{1,3}(,(\d{3}))*((?=[,.](\s|$))|(\.\d+)?(?=[^\d,.]|$)) 

DEMO on RegExr

それはそう長く作ること:

のみ1文字(スペース)で区切って同じ行に複数の番号をマッチング
  1. 部分matchsを許可していないながら、先読みが必要です見どころ。
  2. .,で終わる番号の一致は、.または,をマッチに含めずに、別の先読みが必要です。

(?=[,.](\s|$))説明

私は、文字列の最後に1,と一致するように、(\s|$)する\sニーズを実現し、この説明を書くとき。

正規表現のこの部分は、そう私たちの数は1,000.(端に.付き)であるとしましょう1,000.1,1または1,000を一致させるためです。この時点までの正規表現は1,000に一致した

、それはそれが私たちの(?=[,.](\s|$))

(?=....)に移行して、別の,は、何千ものグループを繰り返すように見つけることができませんが、我々が持っているところから、意味の先読みを意味し、マッチするまで、来るものを見ますが、マッチに追加しないでください。

したがって、,または.があるかどうかをチェックし、存在する場合は、その直後に空白または入力の終了があることを確認します。この場合、それは一致するようにします。1,000

LookAheadが一致しなかった場合、小数点以下の桁に合わせようとしていました。

+0

これまでのところうまくいくようです。私はもう少しそれをテストします。どうもありがとう! 説明できますか?(?= [、。] \ s)? – LiranBo

+0

ああ、私は答えにその説明を追加します。 – OGHaza

+0

答えが更新されました - 私はエッジケースを可能にするために正規表現にわずかな変更を加えなければなりませんでした。 – OGHaza

1

これは、あなたが

^[0-9]{1,3}(,[0-9]{3})*(([\\.,]{1}[0-9]*)|())$ 
+0

には^$タグがありません。何も返されません。上記の例では を使用しないと、一致してはならない例がいくつか返されます。 – LiranBo

0

.を列挙されているすべてのもののために働くには、「任意の文字」を意味します。リテラル.を使用するには、\.のようにエスケープします。

私が知る限り、これは唯一欠けているものです。

+0

彼は同じ行に複数の数字をマッチさせたいので、彼の現在の正規表現では、あらゆる種類の不必要なマッチを得る:[DEMO](http://regexr.com?37asm) – OGHaza

+0

不必要なマッチはありますか?一番下の行に部分一致がありますが、有効な数字です。 –

+0

OPが不一致としてリストされた入力に対して部分一致をとることはほとんどありません。私のように、 '1 -2 -3'と' '1 '、' 2 '、' 3 ''を返すリストの正の数を求めています。確かにそれらはリストに現れる正の数ですが、有用な文脈の中から取り除かれています。 – OGHaza