10進数の正規表現。10進数の後の数字はオプションです。


112

数値を検証する正規表現が必要ですが、小数点以下の桁は必要ありません。すなわち。

123
123.
123.4

すべて有効です

123..

無効になります

どれでも大歓迎です!


最良の答えはここにある:stackoverflow.com/a/39399503/715269
Gangnus

回答:


189

以下を使用します。

/^\d*\.?\d*$/
  • ^ -ラインの始まり。
  • \d* -0桁以上
  • \.?-オプションのドット(正規表現で.は特殊文字であるためエスケープされます)。
  • \d* -0桁以上(小数部);
  • $ -行の終わり。

これにより、0.5のように先行ゼロを要求するのではなく、0.5の小数が可能になります。


2
@OrangeDog、あなたのオリジナルは望まれるよりも多く一致します。例: 'cow3.45tornado';)
S.アルバノ

39
また、有効な10進数ではない単一のドットにも一致します。より良い正規表現は/^\d*\.?\d+$/、小数点の後に数字を強制するでしょう。
Chandranshu 2013年

2
@Chandranshuと空の文字列が一致しますが、これも変更によって解決されます。
OGHaza 2013年

2
@Chandranshu "小数点以下の桁は必要ありません"
OrangeDog

3
このソリューションは機能しません。OPが明確に言う間、それは小数を必要とします:オプションの小数。
Alex G

113
/\d+\.?\d*/

1桁以上の数字(\d+)、オプションのピリオド(\.?)、0桁以上の数字(\d*)。

使用法または正規表現エンジンによっては、開始/終了行アンカーを追加する必要がある場合があります。

/^\d+\.?\d*$/

正規表現の可視化

Debuggexデモ


12
ええ、でもトップ投票の答えは間違っています、それは両方.と空の文字列に一致します。
OrangeDog 2014

1
@Gangnusまた、「。digit」が一致する必要があるとは言っていません。彼らがそれを望んだなら、彼らは言ったはずだった。
OrangeDog 2017

2
@EqualityInTechそうではないと確信しています-グループ化はまったくありません。
OrangeDog 2018年

1
うーん...私が思ったように、私は邪悪な正規表現を完全に理解していないかもしれないと思います。ごめんなさい。
JDBは2018

1
@AlexanderRyanBaggettこれは、質問が指定したものと正確に一致します。ご覧のとおり-、まったく含まれていません。
OrangeDog

74

適切に行うには、次のような正規表現が必要です。

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

(Perlでサポートされている)拡張修飾子を使用した、空白を含む同じ式:

/^  [+-]? ( (\d+ (\.\d*)?)  |  (\.\d+) ) $/x

またはコメント付き:

/^           # Beginning of string
 [+-]?       # Optional plus or minus character
 (           # Followed by either:
   (           #   Start of first option
     \d+       #   One or more digits
     (\.\d*)?  #   Optionally followed by: one decimal point and zero or more digits
   )           #   End of first option
   |           # or
   (\.\d+)     #   One decimal point followed by one or more digits
 )           # End of grouping of the OR options
 $           # End of string (i.e. no extra characters remaining)
 /x          # Extended modifier (allows whitespace & comments in regular expression)

たとえば、次のように一致します。

  • 123
  • 23.45
  • 34。
  • .45
  • -123
  • -273.15
  • -42。
  • -.45
  • +516
  • +9.8
  • +2。
  • +.5

そして、これらの非数値を拒否します:

  • 。(単一小数点)
  • -。(負の小数点)
  • +。(プラス小数点)
  • (空の文字列)

より単純なソリューションでは、有効な数値を誤って拒否したり、これらの非数値と一致したりする可能性があります。


1
ピリオド(42.)が後に続く数字と一致するため、最適です。ただし、これに一致するバグ/誤検知があります:3 .... 3これは、括弧を2つ追加して^ $の開始文字と終了文字を強制することで修正できます:/ ^([+-]?(\ d +(\ 。\ d *)?)|(\。\ d +))$ /
ピートアルヴィン

1
ピート、ありがとうございます。括弧が追加され、意図したとおりに動作するようになりました。現在はのように書かれてい^A?(B|C)$ます。以前は、どちらが正しくなかったか^A?B|C$を実際に意味するように書かれ(^A?B)|(C$)ていました。注:^(A?B|C)$実際には^((A?B)|(C))$「+.5」と一致しないありません。
ホイレン、2014

2
これが最良の答えです。他の回答はすべてのケースを処理するわけではありません。先読みを使用して不足桁のケースを処理することを除いて、私も同じようなことをしています:/^[+-]?(?=\d|\.\d)\d*(\.\d*)?$ /
PhilHarvey 2015

1
これがここでの唯一の正しい正規表現です。しかし、一部の人々は「34」に反対するでしょう。*ではなく2番目のdの後に+を提案します
Gangnus

1
これは0000.2にも一致しますが、これはおそらく望ましいことではありません。
アーロン・ゾレル

11

この正規表現を試してください:

\d+\.?\d*

オプションの10進数の前の\ d +桁
。?オプションの10進数(?数量詞によるオプション)
\ d * 10進数の後のオプションの数字


1
いいえ、一致しません123.
Bart Kiers、2012

1
メモありがとうございます。私の正規表現を変更しました。
カシュ

4
確かに、しかし、今あなたはそれをすでに他の誰かによって投稿されたものに編集しました。さらに別の「正しい」答えを削除することを検討してください。
Bart Kiers、2012

10

これはすべての要件に一致するため、これが最良の方法だと思います。

^\d+(\\.\d+)?$

1
「4」という文字列なので、私にとってはこれが最良の答えです。(たとえば)は、少なくともルビ言語では有効な数値ではありません。ただし、最も賛成された回答は「4」を受け入れます。間違った数の正規表現として。
ビクター

3

私は以下を使用してしまいました:

^\d*\.?\d+$

これにより、以下が無効になります。

.
3.

使用している言語によっては、スラッシュが必要になる場合があります。例:/^\d*\.?\d+$/
Charles Naccio

これは許可されます.3
Royi Namir



2

これは私がやったことです。上記のどれよりも厳格です(一部よりも正確です)。

^0$|^[1-9]\d*$|^\.\d+$|^0\.\d*$|^[1-9]\d*\.\d*$

渡される文字列:

0
0.
1
123
123.
123.4
.0
.0123
.123
0.123
1.234
12.34

失敗する文字列:

.
00000
01
.0.
..
00.123
02.134

2
^[+-]?(([1-9][0-9]*)?[0-9](\.[0-9]*)?|\.[0-9]+)$

人々が通常正しい形式の10進数と考えるものを反映する必要があります。

小数点の前の数字は、1桁の場合(0から9の場合もある)、または1桁以上の場合(0から始めることはできません)のいずれかです。

小数点記号の前に数字がある場合、小数とそれに続く数字はオプションです。それ以外の場合は、10進数の後に少なくとも1桁の数字が必要です。小数点の後に複数の末尾の0が許可されることに注意してください。

grep -E '^[+-]?(([1-9][0-9]*)?[0-9](\.[0-9]*)?|\.[0-9]+)$'

次と正しく一致します。

9
0
10
10.
0.
0.0
0.100
0.10
0.01
10.0
10.10
.0
.1
.00
.100
.001

署名された同等のものと同様に、次を拒否します。

.
00
01
00.0
01.3

署名された同等物、および空の文字列。


1
(?<![^d])\d+(?:\.\d+)?(?![^d])

清潔でシンプル。

これは、サフィックスとプレフィックス、RegEx機能を使用します。

直接trueを返します-IsMatch条件の場合はfalse


1
^\d+(()|(\.\d+)?)$

これを思いついた。整数と10進数の両方を使用できますが、10進数を入力する場合は、完全な10進数(先頭と末尾の数字)を強制します。


1

あなたが尋ねたものはすでに答えられているので、これは、オプションの小数点が入力された場合に2桁の10進数のみが必要な人のための追加情報です。

^\d+(\.\d{2})?$

^:文字列の先頭
\ d:数字([0-9]と等しい)
+:1回、無制限

キャプチャグループ(。\ d {2})?
?:0回と1回。: キャラクター 。
\ d:数字([0-9]と等しい)
{2}:正確に2倍
$:文字列の終わり

1:一致する
123:一致する
123.00:一致する
123 .:一致しない
123 ..:一致しない
123.0:一致しない
123.000:一致しない
123.00.00:一致しない


これは負の数と一致しますか?
Alexander Ryan Baggett

1
@AlexanderRyanBaggett負の符号をチェックする必要があるため、次のようになります。^-?\ d +(\。\ d {2})?$
PersyJack

0

Perlでは、Regexp :: Commonを使用します。これにより、特定の数値形式の微調整された正規表現を組み立てることができます。Perlを使用していない場合でも、生成された正規表現は通常、他の言語で引き続き使用できます。

Regexp :: Common :: Numberに正規表現の例を生成した結果を出力します。

$ perl -MRegexp::Common=number -E 'say $RE{num}{int}'
(?:(?:[-+]?)(?:[0123456789]+))

$ perl -MRegexp::Common=number -E 'say $RE{num}{real}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789])(?:[0123456789]*)(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[-+]?)(?:[0123456789]+))|))

$ perl -MRegexp::Common=number -E 'say $RE{num}{real}{-base=>16}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789ABCDEF])(?:[0123456789ABCDEF]*)(?:(?:[.])(?:[0123456789ABCDEF]{0,}))?)(?:(?:[G])(?:(?:[-+]?)(?:[0123456789ABCDEF]+))|))

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.