14

以下に一致する正規表現が必要です。

.5
0.5
1.5
1234

だがしかし

0.5.5
absnd (any letter character or space)

私はすべてを満足させるこれを持っていますが、0.5.5

^[.?\d]+$
4

5 に答える 5

33

これはかなり一般的なタスクです。私が知っている最も簡単な対処方法は次のとおりです。

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

先頭のゼロやコンマなどを許可するかどうかなど、他の複雑な問題もあります。これは、必要に応じて複雑にすることができます。たとえば、1,234,567.89 形式を許可する場合は、次のようにします。

^[+-]?(\d*|\d{1,3}(,\d{3})*)(\.\d+)?\b$

単語の区切り\bがありますが、文字列の最後に少なくとも 1 つの数字を要求する卑劣な方法として使用しています。このように、空の文字列または単一の文字列+は一致しません。

ただし、正規表現は数値文字列を解析する理想的な方法ではないことに注意してください。私が知っているすべての最新のプログラミング言語には、それを行うための高速でシンプルな組み込みメソッドがあります。

于 2012-06-06T19:48:15.953 に答える
13

これは、先読みや後読みを使用しない、はるかに単純なソリューションです。

^\d*\.?\d+$

これが機能する理由を明確に理解するには、右から左に読んでください。

  • 最後に少なくとも 1 桁の数字が必要です。
    7動作
    77します 動作 し
    .77ます 動作 します
    0.77動作
    0.しません
    空の文字列は動作しません
  • 数字の前の単一のピリオドはオプションです。
    .77動作 します
    77動作
    ..77しません
  • (オプションの) ピリオドの前の任意の桁数。 .77作品
    0.77作品
    0077.77作品
    0077作品

先読みと後読みを使用しないことには、RegEx ベースの DOS 攻撃を心配する必要がないという追加の利点があります。

HTH

于 2016-12-14T17:24:27.020 に答える
12

誰も負の数を説明していないようです。また、不要なキャプチャ グループを作成している人もいます。これは最も徹底的なソリューション IMO です。

^[+-]?(?:\d*\.)?\d+$
于 2012-06-06T19:50:43.677 に答える
3

以下が機能するはずです。

^(?!.*\..*\.)[.\d]+$

これは、否定先読みを使用して、文字列内の文字が 2 文字未満であることを確認し.ます。

http://www.rubular.com/r/N3jl1ifJDX

于 2012-06-06T19:48:19.913 に答える
1

これはうまくいくかもしれません:

^(?:\d*\.)?\d+$
于 2012-06-06T19:48:01.593 に答える