web-dev-qa-db-ja.com

文字列に数字だけが含まれているかどうかを調べるための正規表現

hash = window.location.hash.substr(1);
var reg = new RegExp('^[0-9]$');
console.log(reg.test(hash));

"123""123f"の両方が間違っています。ハッシュに数字しか含まれていないかどうかをチェックしたいです。私は何か見落としてますか?

219
Johan
var reg = /^\d+$/;

それをするべきです。オリジナルは正確に1桁からなるものすべてに一致します。

407
Mike Samuel

あなたが言ったように、あなたはハッシュが数字だけを含むことを望みます。

var reg = new RegExp('^[0-9]+$');

または

var reg = new RegExp('^\\d+$');

\d[0-9]はどちらも同じ意味です。 +を使用すると、[0-9]が1つ以上出現することを検索します。

86

これは符号付きの浮動小数点数や空文字列も可能にします。

var reg = /^-?\d*\.?\d*$/

空の文字列を許可したくない場合は、これを使用してください。

var reg = /^-?\d+\.?\d*$/
60
codename-
var validation = {
    isEmailAddress:function(str) {
        var pattern =/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
        return pattern.test(str);  // returns a boolean
    },
    isNotEmpty:function (str) {
        var pattern =/\S+/;
        return pattern.test(str);  // returns a boolean
    },
    isNumber:function(str) {
        var pattern = /^\d+$/;
        return pattern.test(str);  // returns a boolean
    },
    isSame:function(str1,str2){
        return str1 === str2;
    }
};   

alert(validation.isNotEmpty("dff"));
alert(validation.isNumber(44));
alert(validation.isEmailAddress("[email protected]"));
alert(validation.isSame("sf","sf"));
44
Dastagir

これはあなたの目的のためには極端にやり過ぎですが、ここで私が使用しているものがあります。

var numberReSnippet = "(?:NaN|-?(?:(?:\\d+|\\d*\\.\\d+)(?:[E|e][+|-]?\\d+)?|Infinity))";
var matchOnlyNumberRe = new RegExp("^("+ numberReSnippet + ")$");

私の知る限りでは、これは "-Infinity"、 "1e-24"、および "NaN"を含む、JavaとJavaScriptがこれまであなたに投げかけるであろう数のすべてのバリエーションと一致します。また、「 - 5」のように、入力した番号と一致します。

書かれているように、reSnippetは他の正規表現に落とされるように設計されているので、あなたは数を抽出する(あるいは避ける)ことができます。すべての括弧にもかかわらず、キャプチャグループは含まれていません。したがって、 "matchOnlyNumberRe"は数字である文字列のみに一致し、文字列全体のキャプチャグループを持ちます。

これはJasmineのテストです。

describe("Number Regex", function() {
    var re = new RegExp("^("+ numberReSnippet + ")$");
    it("Matches Java and JavaScript numbers", function() {
        expect(re.test(         "1")).toBe(true);
        expect(re.test(       "0.2")).toBe(true);
        expect(re.test(     "0.4E4")).toBe(true);  // Java-style
        expect(re.test(       "-55")).toBe(true);
        expect(re.test(      "-0.6")).toBe(true);
        expect(re.test(  "-0.77E77")).toBe(true);
        expect(re.test(      "88E8")).toBe(true);
        expect(re.test(       "NaN")).toBe(true);
        expect(re.test(  "Infinity")).toBe(true);
        expect(re.test( "-Infinity")).toBe(true);
        expect(re.test(     "1e+24")).toBe(true);  // JavaScript-style
    });
    it("Matches fractions with a leading decimal point", function() {
        expect(re.test(        ".3")).toBe(true);
        expect(re.test(       "-.3")).toBe(true);
        expect(re.test(     ".3e-4")).toBe(true);
    });
    it("Doesn't match non-numbers", function() {
        expect(re.test(         ".")).toBe(false);
        expect(re.test(        "9.")).toBe(false);
        expect(re.test(          "")).toBe(false);
        expect(re.test(         "E")).toBe(false);
        expect(re.test(       "e24")).toBe(false);
        expect(re.test(   "1e+24.5")).toBe(false);
        expect(re.test("-.Infinity")).toBe(false);
    });
});
16
David Leppik
^[0-9]$ 

...は任意の1桁に一致する正規表現なので、1はtrueを返しますが123はfalseを返します。

*数量詞を追加すると、

^[0-9]*$

式は任意の長さの数字列に一致し、123はtrueを返します。 (123fはまだfalseを返します)。

技術的には空の文字列は長さ0の数字列であるため、^ [0-9] * $を使用してtrueを返すことに注意してください。1桁以上の文字列のみを受け入れる場合は、*ではなく+を使用します。

^[0-9]+$

他の多くの人が指摘したように、これを達成するにはいくつかの方法がありますが、元の質問のコードは意図したとおりに機能するために追加の1文字しか必要ないことを指摘するのが適切だと思いました。

12
user1299656

この関数は、通常の数字検出機能が機能することを期待して、入力が古典的な意味で数値であるかどうかをチェックします。

たとえば、HTMLフォーム入力に使用できるテストです。

これは、tipeof(NaN)= number、parseint( '1 Kg')= 1、ブール値を数値に変換するなどのように、すべてのJSの民間伝承を迂回します。

引数を文字列としてレンダリングし、@ codename-のように正規表現に対してその文字列をチェックすることによってそれを行いますが、5.や.5のようなエントリを許可します。

function isANumber( n ) {
    var numStr = /^-?(\d+\.?\d*)$|(\d*\.?\d+)$/;
    return numStr.test( n.toString() );
}

not numeric:
Logger.log( 'isANumber( "aaa" ): ' + isANumber( 'aaa' ) );
Logger.log( 'isANumber( "" ): ' + isANumber( '' ) );
Logger.log( 'isANumber( "lkjh" ): ' + isANumber( 'lkjh' ) );
Logger.log( 'isANumber( 0/0 ): ' + isANumber( 0 / 0 ) );
Logger.log( 'isANumber( 1/0 ): ' + isANumber( 1 / 0 ) );
Logger.log( 'isANumber( "1Kg" ): ' + isANumber( '1Kg' ) );
Logger.log( 'isANumber( "1 Kg" ): ' + isANumber( '1 Kg' ) );
Logger.log( 'isANumber( false ): ' + isANumber( false ) );
Logger.log( 'isANumber( true ): ' + isANumber( true ) );

numeric:
Logger.log( 'isANumber( "0" ): ' + isANumber( '0' ) );
Logger.log( 'isANumber( "12.5" ): ' + isANumber( '12.5' ) );
Logger.log( 'isANumber( ".5" ): ' + isANumber( '.5' ) );
Logger.log( 'isANumber( "5." ): ' + isANumber( '5.' ) );
Logger.log( 'isANumber( "-5" ): ' + isANumber( '-5' ) );
Logger.log( 'isANumber( "-5." ): ' + isANumber( '-5.' ) );
Logger.log( 'isANumber( "-.5" ): ' + isANumber( '-5.' ) );
Logger.log( 'isANumber( "1234567890" ): ' + isANumber( '1234567890' ));

正規表現の説明

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

チェックが文字列全体に及ぶように、先頭の "^"と最後の "$"は文字列の最初と最後に一致します。 「 - ?」部分は「?」付きのマイナス記号です。それのゼロか1つの例を可能にする乗数。

それから括弧で区切られた2つの類似したグループがあります。文字列はこれらのグループのどちらかと一致する必要があります。最初のものは5.のような数字にマッチし、2番目のものは.5とマッチします。

最初のグループは

\d+\.?\d*

"\ d +"は数字(\ d)に1回以上一致します。
「\?」小数点(その魔法のためにそれを無効にするために "\"でエスケープされた)、0回または1回。

最後の部分 "\ d *"もまた0桁以上の数字です。
最初の桁を除いてすべての部分はオプションです。したがって、このグループは5のような数字に一致し、他の半分に一致する.5では一致しません。

7
Juan Lanus

正の整数だけが必要で、先頭にゼロが必要ない場合(例: "0001234"や "00"):

var reg = /^(?:[1-9]\d*|\d)$/;
5
Andrej

なぜこんな感じで使わないの?

$.isNumeric($(input).val())

Jqueryテスト済みであり、最も一般的なケースがチェックされています

5
leonardo rey

数字がとんでもないほど大きくないと思われる場合は、おそらく次のようにします。

new RegExp(
    '^' +                           // No leading content.
    '[-+]?' +                       // Optional sign.
    '(?:[0-9]{0,30}\\.)?' +         // Optionally 0-30 decimal digits of mantissa.
    '[0-9]{1,30}' +                 // 1-30 decimal digits of integer or fraction.
    '(?:[Ee][-+]?[1-2]?[0-9])?' +   // Optional exponent 0-29 for scientific notation.
    '$'                             // No trailing content.
)

念のため、これはいくつかのシナリオを避けようとします。

  • 元の文字列が渡される可能性のあるバッファをオーバーフローさせます。
  • 1E-323のような非正規数によって引き起こされた遅さや奇妙さ。
  • 有限数が予想されるときにInfinityを渡す(1E309または-1E309を試してください)。
4
jjrv

*が必要なので、「前の文字の0個以上」と表示されています。

var reg = new RegExp('^\\d*$');
4
Eric Hodonsky

\d は小数点と一致しません。 10進数には以下を使用してください。

const re = /^[0-9.]+$/
'123'.match(re)       // true
'123.3'.match(re)     // true
'123!3'.match(re)     // false
2
Muhammad Adeel

入力時に他の文字を除外して入力フィールドに数字のみを表示したい場合は、キー入力時にフィールドの値を置き換えることができます。

    var yourInput = jQuery('#input-field');
    yourInput.keyup(function() {
        yourInput.val((yourInput.val().replace(/[^\d]/g,'')))
    })   
1
Peter Graham

以下のメソッドを使うこともできますが、それらの内部実装や戻り値に注意してください。

1A isNaN(+'13761123123123'); // returns true
1B isNaN(+'13761123123ABC'); // returns false

2A ~~'1.23'; // returns 1
2B ~~'1.2A'; // returns 0

1Aと1Bでは、文字列はisNaN()関数に渡される前に、まず+演算子を使って型強制されます。これは、数値以外の値を含む数値型がNaNを返すために機能します。 ここ に記載されているisNaN()'sの実装の詳細には考慮があります。考慮すべき点の1つは、isNaN(+false|true)が同等の数値に変換されてfalseが返されるが、テスト対象の意味ではブール値が数値ではないため、関数がtrueを返すことです。

2Aと2Bの場合、数値の補数を求めるには、問題の特定の値が spec で参照できる符号付き32ビット整数の値の範囲内である必要があることに注意する必要があります。

私の個人的な好みは、単項演算子が含まれているため読みにくくなると主張されるかもしれませんが、スピードと簡潔さから1Aと1Bです。

Perf https://jsperf.com/numeric-string-test-regexvsisnan/1

1
swallace

単純な正規表現のJavaScript

var cnpj = "12.32.432/1-22".replace(/\D/gm,"");
console.log(cnpj);

*結果

1232432122

数字だけをチェックします。

if(cnpj.length > 0){
   return true;
}

簡単な例

if("12.32.432/1-22".replace(/\D/gm,"").length > 0){
   console.log("Ok.");
}
1
Renato burton

たぶんそれは動作します:

let a = "1234"
parseInt(a) == a // true
let b = "1234abc"
parseInt(b) == b // false
1
LPOPYui

私はあなたがすでにたくさんの答えを得ているように見えます、しかしあなたが整数と浮動小数点数にマッチすることができる正規表現を探しているなら、これはあなたのために働くでしょう:

var reg = /^-?\d*\.?\d+$/;
0
Progo