正規表現の検証を使用して、10進値または数値のみをチェックしようとしています。しかし、ユーザーは数値を入力します。最初の数字は「0」ではありません
それ、どうやったら出来るの?
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つ以上の数字が続くフルストップです。
実際、与えられた答えはどれもリクエストを完全にカバーしていません。
OPは特定のユースケースまたは数値のタイプを提供しなかったため、考えられるすべてのケースと順列をカバーしようとします。
通常、この番号はunsigned integerと呼ばれますが、ゼロを含めて正の非分数と呼ぶこともできます。これには、0
、1
、99999
などの数字が含まれます。
この検証をカバーする正規表現は次のとおりです。
/^(0|[1-9]\d*)$/
通常、この番号はsigned integerと呼ばれますが、非小数と呼ぶこともできます。これには、0
、1
、99999
、-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と呼ばれますが、ゼロを含めて、正の小数とも呼びます。これには、0
、1
、0.0
、0.1
、1.0
、99999.000001
、5.10
などの数字が含まれます。
この検証をカバーする正規表現は次のとおりです。
/^(0|[1-9]\d*)(\.\d+)?$/
.1
、.0
、.00651
(それぞれ0.1
、0.0
、0.00651
と同じ)などの数字も有効な小数であると言う人もいるかもしれません。したがって、この形式を追加でサポートする正規表現を次に示します。
/^(0|[1-9]\d*)?(\.\d+)?(?<=\d)$/
この番号は通常、signed floatまたはsigned doubleと呼ばれますが、分数とも呼ばれます。これには、0
、1
、0.0
、0.1
、1.0
、99999.000001
、5.10
、-0
、-1
、-0.0
、-0.1
、-99999.000001
、5.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
を使用した数字をサポートしたい場合があります。これは、非常に長い数字を表すために作成された、絶対に有効な数字です。科学表記法の詳細については、こちらをご覧ください こちら 。これらの番号は通常、1e3
(1000
)、1e-3
(0.001)のように見え、多くの主要なプログラミング言語(JavaScriptなど)で完全にサポートされています。式'1e3'==1000
がtrue
を返すかどうかを確認することでテストできます。
科学表記法の数字を含む上記のすべてのセクションのサポートを分割します。
全体の正の数の正規表現の検証は、6e4
、16e-10
、0e0
などの数値をサポートしますが、0
、11
などの通常の数値もサポートします。
/^(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.1e3
、56.0e-3
、0.0e10
、1.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
多くのプログラミング言語では、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,'');
}
私は同じ問題を抱えていましたが、「。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, "");
};
マシュー・デスヴォーニュ
指定されたすべての正規表現をテストしましたが、残念ながらそれらのテストに合格するものはありません。
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$"
これは、数値の素晴らしい正規表現です。これは、カンマと小数を含む数値を受け入れます。
/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/
このコードを試して、それがあなたを助けることを願って
String regex = "(\\d+)(\\.)?(\\d+)?"; for integer and decimal like 232 232.12
/([0-9]+[.,]*)+/
は、コマまたはドットを含むまたは含まない任意の数に一致します
それは一致することができます
122
122,354
122.88
112,262,123.7678
バグ:262.4377,3883にも一致します(ただし、本質的には関係ありません)
数値を検証するための正規表現は次のとおりです。
^(-?[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"};
ドット、コンマ、プラス、マイナスで小数を検証する必要がある場合は、これを試してください:
Object testObject = "-1.5";
boolean isDecimal = Pattern.matches("^[\\+\\-]{0,1}[0-9]+[\\.\\,]{1}[0-9]+$", (CharSequence) testObject);
幸運を。
上記の要件に最適なものは次のとおりです。
^[0-9]{1,3}(,[0-9]{3})*(([\\.,]{1}[0-9]*)|())$