web-dev-qa-db-ja.com

正規表現検証の10進数または数値

正規表現の検証を使用して、10進値または数値のみをチェックしようとしています。しかし、ユーザーは数値を入力します。最初の数字は「0」ではありません

それ、どうやったら出来るの?

53
ilkdrl

1から9の範囲の数字とそれに続く0個以上の他の数字:

^[1-9]\d*$

オプションの小数点の後に数字が続く数字を許可します。 1〜9の範囲の数字の後に0個以上の他の数字が続き、オプションで小数点の後に少なくとも1桁の数字が続きます。

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

注:

  • ^および$アンカーは、文字列全体がパターンに一致する必要があると基本的に言って、開始と終了にアンカーします

  • ()?は、括弧内の全体の0または1に一致します

コンマを処理するための更新:

正規表現では、.には特別な意味があります-任意の1文字に一致します。文字列内の.を文字通り一致させるには、.を使用して\.escapeする必要があります。これは上記の正規表現の\.の意味です。そのため、代わりにカンマを使用する場合、パターンは単純です:

^[1-9]\d*(,\d+)?$

コンマとフルストップを処理するための更なる更新

数字のグループ間でを許可し、整数部と小数部の間でを許可する場合は、次を試してください。

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

つまり、これは1-9の範囲の数字で、その後に他の2桁までの数字が続き、ゼロ以上のフルストップのグループの後に3桁が続き、オプションで以前のようにコンマと数字が続きます。

を数字の間の任意の場所に許可する場合は、次を試してください。

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

つまり、1-9の数字の後にゼロ個以上の数字が続くか、オプションでコンマと1つ以上の数字が続くフルストップです。

118
mikej

実際、与えられた答えはどれもリクエストを完全にカバーしていません。
OPは特定のユースケースまたは数値のタイプを提供しなかったため、考えられるすべてのケースと順列をカバーしようとします。

通常の番号

全陽性

通常、この番号はunsigned integerと呼ばれますが、ゼロを含めて正の非分数と呼ぶこともできます。これには、0199999などの数字が含まれます。
この検証をカバーする正規表現は次のとおりです。

/^(0|[1-9]\d*)$/

この正規表現をテストする

全体的に正と負

通常、この番号はsigned integerと呼ばれますが、非小数と呼ぶこともできます。これには、0199999-99999-1、および -0 などの数字が含まれます。
この検証をカバーする正規表現は次のとおりです。

/^-?(0|[1-9]\d*)$/

この正規表現をテストする

お気づきかもしれませんが、有効な番号として-0も含めています。しかし、この使用法に異議を唱え、これが実数ではないと言う人もいるかもしれません(Signed Zero here について詳しく読むことができます)。そのため、この正規表現からこの番号を除外する場合は、代わりに使用する必要があります。

/^-?(0|[1-9]\d*)(?<!-0)$/

この正規表現をテストする

追加したのは(?<!-0)だけです。つまり、このアサーションの前に-0を含めないことを意味します。この(?<!...)アサーションは、negative lookbehindと呼ばれます。つまり、このアサーションの前に...を置き換えるフレーズは表示されません。 Lookbehindには制限があります。フレーズに数量詞を含めることはできません。そのため、場合によっては代わりにLookaheadを使用します。これは同じですが、逆の方法です。

PerlおよびPythonで使用されるものを含む多くの正規表現フレーバーでは、固定長文字列のみが許可されます。リテラルテキスト、文字エスケープ、\X以外のUnicodeエスケープ、および文字クラスを使用できます。量指定子または後方参照は使用できません。代替を使用できますが、すべての代替の長さが同じ場合のみです。これらのフレーバーは、最初に後読みが必要な数の文字の対象文字列をステップバックし、次に後読み内で左から右に正規表現を試行することにより、後読みを評価します。

Lookaroundアサーションの詳細については、こちらをご覧ください こちら

分数

ポジティブ

通常、この番号はunsigned floatまたはunsigned doubleと呼ばれますが、ゼロを含めて、正の小数とも呼びます。これには、010.00.11.099999.0000015.10などの数字が含まれます。
この検証をカバーする正規表現は次のとおりです。

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

この正規表現をテストする

.1.0.00651(それぞれ0.10.00.00651と同じ)などの数字も有効な小数であると言う人もいるかもしれません。したがって、この形式を追加でサポートする正規表現を次に示します。

/^(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/

この正規表現をテストする

負と正

この番号は通常、signed floatまたはsigned doubleと呼ばれますが、分数とも呼ばれます。これには、010.00.11.099999.0000015.10-0-1-0.0-0.1-99999.0000015.10などの数値が含まれます。
この検証をカバーする正規表現は次のとおりです。

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

この正規表現をテストする

-0信者以外の場合:

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

この正規表現をテストする

.1-.1などの非表示のゼロ表現もサポートする場合は、次の正規表現を使用します。

/^-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/

この正規表現をテストする

-0以外の信者と目に見えないゼロ信者の組み合わせは、次の正規表現を使用します。

/^(?!-0?(\.0+)?$)-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/

この正規表現をテストする

科学表記法の指数(別名指数表記法)

一部の人は、検証で、科学文字eを使用した数字をサポートしたい場合があります。これは、非常に長い数字を表すために作成された、絶対に有効な数字です。科学表記法の詳細については、こちらをご覧ください こちら 。これらの番号は通常、1e31000)、1e-3(0.001)のように見え、多くの主要なプログラミング言語(JavaScriptなど)で完全にサポートされています。式'1e3'==1000trueを返すかどうかを確認することでテストできます。
科学表記法の数字を含む上記のすべてのセクションのサポートを分割します。

通常の番号

全体の正の数の正規表現の検証は、6e416e-100e0などの数値をサポートしますが、011などの通常の数値もサポートします。

/^(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i

この正規表現をテストする

正および負の整数正規表現の検証は、-6e4-16e-10-0e0などの数値をサポートしますが、-0-11などの通常の数値、および上記のすべての正の数値もサポートします。

/^-?(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i

この正規表現をテストする

-0信者に対する正および負の数値正規表現検証全体。上記と同じですが、-0-0e0-0e5-0e-6などの数値を禁止するようになりました。

/^(?!-0)-?(0|[1-9]\d*)(e-?(0|[1-9]\d*))?$/i

この正規表現をテストする

分数

正数の正規表現検証では、上記の整数に加えて、0.1e356.0e-30.0e101.010e0などの数値もサポートされます。

/^(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?$/i

この正規表現をテストする

非表示ゼロの正数は正規表現の検証をサポートし、上記の正数に加えて、.1e3.0e0.0e-5.1e-7などの数値もサポートします。

/^(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?$/i

この正規表現をテストする

負および正の数の正規表現検証では、上記の正の数をサポートしていますが、-0e3-0.1e0-56.0e-3-0.0e10などの数もサポートしています。

/^-?(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?$/i

この正規表現をテストする

-0信者に対する負および正の数の正規表現の検証。上記と同じですが、-0-0.00000-0.0e0-0.00000e5-0e-6などの数値を禁止するようになりました。

/^(?!-0(\.0+)?(e|$))-?(0|[1-9]\d*)(\.\d+)?(e-?(0|[1-9]\d*))?$/i

この正規表現をテストする

目に見えないゼロの負数と正数は正規表現の検証をサポートし、上記の正数と負数に加えて、-.1e3-.0e0-.0e-5-.1e-7などの数値もサポートします。

/^-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?$/i

この正規表現をテストする

-0信者と不可視のゼロ信者の組み合わせによる負の数と正の数、上記と同じですが、-.0e0-.0000e15-.0e-19のような数は禁止します。

/^(?!-0?(\.0+)?(e|$))-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?$/i

この正規表現をテストする

16進表記の数字

多くのプログラミング言語では、0x4F7Aのような16進数の文字列表現は、10進数20346に簡単にキャストできます。
したがって、検証スクリプトでサポートすることができます。
次の正規表現は、16進数表現のみをサポートしています。

/^0x[0-9a-f]+$/i

この正規表現をテストする

すべての順列

これらの最終的な正規表現は、不可視のゼロ番号をサポートします。

署名ゼロ信者

/^(-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?|0x[0-9a-f]+)$/i

この正規表現をテストする

非署名ゼロ信者

/^((?!-0?(\.0+)?(e|$))-?(0|[1-9]\d*)?(\.\d+)?(?<=\d)(e-?(0|[1-9]\d*))?|0x[0-9a-f]+)$/i

この正規表現をテストする

多くのプログラミング言語でサポートされているすべての数の順列をカバーしたいと思います。
幸運を!


ああ、言及するのを忘れましたが、数字を検証したい人は千の区切り文字を含んでいるので、最初にすべてのコンマ(,)を掃除する必要があります。そこにはどんな種類の区切り文字があるかもしれません。
ただし、番号を検証する前に、最初にそれらを削除できます。

//JavaScript
function clearSeparators(number)
{
    return number.replace(/,/g,'');
}

私のブログの同様の投稿

69
Slavik Meltser

私は同じ問題を抱えていましたが、「。25」も有効な10進数にしたかったのです。 JavaScriptを使用した私のソリューションは次のとおりです。

function isNumber(v) {
  // [0-9]* Zero or more digits between 0 and 9  (This allows .25 to be considered valid.)
  // ()? Matches 0 or 1 things in the parentheses.  (Allows for an optional decimal point)
  // Decimal point escaped with \.
  // If a decimal point does exist, it must be followed by 1 or more digits [0-9]
  // \d and [0-9] are equivalent 
  // ^ and $ anchor the endpoints so tthe whole string must match.
  return v.trim().length > 0 && v.trim().match(/^[0-9]*(\.[0-9]+)?$/);
}

私のtrim()メソッドは

String.prototype.trim = function() {
  return this.replace(/(^\s*|\s*$)/g, "");
};

マシュー・デスヴォーニュ

7
Matt DesVoigne

指定されたすべての正規表現をテストしましたが、残念ながらそれらのテストに合格するものはありません。

    String []goodNums={"3","-3","0","0.0","1.0","0.1"};
    String []badNums={"001","-00.2",".3","3.","a",""," ","-"," -1","--1","-.1","-0", "2..3", "2-", "2...3", "2.4.3", "5-6-7"};

これらすべてのテストに合格した、私が書いた最高のものは次のとおりです。

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

enter image description here

6
Nikita Kurtin

これは、数値の素晴らしい正規表現です。これは、カンマと小数を含む数値を受け入れます。

/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/
2
zeros-and-ones

このコードを試して、それがあなたを助けることを願って

String regex = "(\\d+)(\\.)?(\\d+)?";  for integer and decimal like 232 232.12 
1
biswajit bastia

/([0-9]+[.,]*)+/は、コマまたはドットを含むまたは含まない任意の数に一致します

それは一致することができます

         122
         122,354
         122.88
         112,262,123.7678

バグ:262.4377,3883にも一致します(ただし、本質的には関係ありません)

1
Satheesh Kumar

数値を検証するための正規表現は次のとおりです。

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

有効な数字:

String []validNumbers={"3","-3","0","0.0","1.0","0.1","0.0001","-555","94549870965"};

無効な番号:

String []invalidNumbers={"a",""," ","-","001","-00.2","000.5",".3","3."," -1","--1","-.1","-0"};
1
Marina K.

ドット、コンマ、プラス、マイナスで小数を検証する必要がある場合は、これを試してください:

Object testObject = "-1.5";
boolean isDecimal = Pattern.matches("^[\\+\\-]{0,1}[0-9]+[\\.\\,]{1}[0-9]+$", (CharSequence) testObject);

幸運を。

0
august0490

上記の要件に最適なものは次のとおりです。

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