it-swarm.com.de

Regex, um zu prüfen, ob eine Zeichenfolge nur Zahlen enthält

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

Ich bekomme sowohl bei "123" als auch bei "123f" falsch. Ich möchte prüfen, ob der Hash nur Zahlen enthält. Habe ich etwas verpasst?

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

sollte es tun. Das Original stimmt mit allem überein, was aus genau einer Ziffer besteht.

382
Mike Samuel

Wie Sie sagten, möchten Sie, dass Hash nur Zahlen enthält.

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

oder 

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

\d und [0-9] bedeuten beide dasselbe . Das verwendete + bedeutet, dass nach einem oder mehreren Vorkommen von [0-9] gesucht wird.

82

Dies erlaubt auch vorzeichenbehaftete und Float-Nummern oder leere Zeichenfolgen:

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

Wenn Sie die Zeichenfolge nicht leeren möchten, verwenden Sie diese:

var reg = /^-?\d+\.?\d*$/
59
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"));
40
Dastagir

Dies ist ein extremer Overkill für Ihre Zwecke, aber ich verwende Folgendes:

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

Meines Wissens entspricht dies allen Variationen der Zahlen, die Java und JavaScript je auf Sie werfen, einschließlich "-Infinity", "1e-24" und "NaN". Es stimmt auch mit Zahlen überein, die Sie eingeben könnten, z. B. "-.5".

Wie geschrieben, ist reSnippet so konzipiert, dass es in andere reguläre Ausdrücke eingefügt wird, sodass Sie Zahlen extrahieren (oder vermeiden) können. Trotz aller Klammern enthält es keine Erfassungsgruppen. Daher stimmt "matchOnlyNumberRe" nur mit Zeichenfolgen überein, die Zahlen sind, und verfügt über eine Erfassungsgruppe für die gesamte Zeichenfolge.

Hier sind die Jasmin-Tests, damit Sie sehen können, was es tut und was nicht:

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]$ 

... ist ein regulärer Ausdruck, der mit einer einzelnen Ziffer übereinstimmt. 1 gibt also true zurück, aber 123 gibt false zurück.

Wenn Sie den Quantifizierer * hinzufügen,

^[0-9]*$

der Ausdruck passt auf beliebige Ziffernfolgen und 123 gibt true zurück. (123f gibt immer noch false zurück).

Beachten Sie, dass eine leere Zeichenfolge technisch eine 0-Zeichenfolge von Ziffern ist. Daher wird sie mit ^ [0-9] * $ zurückgegeben.

^[0-9]+$

Wie die vielen anderen darauf hingewiesen haben, gibt es mehrere Möglichkeiten, dies zu erreichen, aber es schien mir angebracht, darauf hinzuweisen, dass der Code in der ursprünglichen Frage nur einen einzigen zusätzlichen Buchstaben benötigt, um wie beabsichtigt zu funktionieren.

12
user1299656

Diese Funktion prüft, ob ihre Eingabe im klassischen Sinne numerisch ist, da erwartet wird, dass eine normale Zahlenerkennungsfunktion funktioniert. 

Dies ist ein Test, den Sie beispielsweise für die HTML-Formulareingabe verwenden können. 

Es umgeht die gesamte JS-Folklore, wie tipeof (NaN) = number, parseint ('1 Kg') = 1, boolesche Zahlen zu Zahlen und dergleichen. 

Dazu wird das Argument als String dargestellt und der String mit einem Regex wie dem von @ codename- geprüft, wobei Einträge wie 5. und .5 zulässig sind 

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' ));

Erklärung der Regex: 

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

Das erste "^" und das letzte "$" stimmen mit dem Anfang und dem Ende der Zeichenfolge überein, um sicherzustellen, dass die Prüfung die gesamte Zeichenfolge umfasst. Das "-?" Teil ist das Minuszeichen mit dem "?" Multiplikator, der null oder eine Instanz davon erlaubt.

Dann gibt es zwei ähnliche Gruppen, die durch Klammern abgegrenzt sind. Die Zeichenfolge muss mit einer dieser Gruppen übereinstimmen. Die erste entspricht Zahlen wie 5. und die zweite .5

Die erste Gruppe ist 

\d+\.?\d*

Das "\ d +" stimmt mit einer Ziffer (\ d) einmal oder mehrmals überein.
Das "\.?" ist der Dezimalpunkt (mit "\" gekennzeichnet, um ihn seiner Magie zu entziehen), null oder einmal. 

Der letzte Teil "\ d *" ist wieder eine Ziffer, null oder mehrmals.
Alle Teile sind optional, aber die erste Ziffer, daher werden in dieser Gruppe Zahlen wie 5 und nicht 0,5 angegeben, denen die andere Hälfte entspricht. 

7
Juan Lanus

Wenn Sie nur positive Ganzzahlen benötigen und keine führenden Nullen benötigen (z. B. "0001234" oder "00"):

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

Warum verwenden Sie nicht etwas wie:

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

Ist jquery getestet, und der häufigste Fall wird geprüft

5
leonardo rey

Wenn die Zahlen nicht absurd groß sein sollen, verwenden Sie vielleicht:

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.
)

Dies versucht einige Szenarien zu vermeiden, nur für den Fall:

  • Überlaufende Puffer, an die der ursprüngliche String übergeben werden könnte. 
  • Langsamkeit oder Kuriositäten, verursacht durch normale Zahlen wie 1E-323.
  • Infinity übergeben, wenn eine endliche Zahl erwartet wird (versuchen Sie 1E309 oder -1E309).
4
jjrv

Sie benötigen den *, damit "null oder mehr des vorherigen Zeichens" angezeigt wird, und dies sollte dies tun:

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

Wenn Sie bei der Eingabe andere Zeichen herausfiltern und nur Zahlen im Eingabefeld anzeigen möchten, können Sie den Wert des Felds bei der Eingabe durch tippen:

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

Sie können auch die folgenden Methoden verwenden, sich jedoch ihrer internen Implementierungs- und/oder Rückgabewerte bewusst sein.

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

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

Für 1A und 1B wird der String zuerst mit dem +-Operator erzwungen, bevor er an die isNaN()-Funktion übergeben wird. Dies funktioniert, weil Zahlentypen, die nicht numerische Werte enthalten, NaN zurückgeben. Es gibt Überlegungen zu den isNaN()'s-Implementierungsdetails, die hier dokumentiert sind. Eine Überlegung ist, wenn ein boolescher Wert übergeben wird, da isNaN(+false|true) zu ihren numerischen Äquivalenten gezwungen wird und daher false zurückgegeben wird. Es kann jedoch davon ausgegangen werden, dass die Funktion true zurückgibt, da der boolesche Wert nicht im Sinne unserer Tests numerisch ist.

Für 2A und 2B ist es erwähnenswert, dass das Finden des Komplements der Zahl erfordert, dass der betreffende Wert innerhalb des Bereichs der Werte einer 32-Bit-Ganzzahl mit Vorzeichen liegt, auf die in der spec verwiesen werden kann.

Meine persönliche Vorliebe ist, obwohl sie als weniger lesbar geltend gemacht werden könnte, da sie den unären Operator enthält, aufgrund der Schnelligkeit und Prägnanz 1A & 1B.

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

1
swallace

Einfaches Regex-Javascript  

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

* Ergebnis

1232432122

Überprüft nur für Zahlen:

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

Einfaches Beispiel  

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

Vielleicht funktioniert es:

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

\d stimmt nicht mit dem Dezimalpunkt überein. Verwenden Sie für die Dezimalstelle Folgendes.

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

Wie Sie sehen, haben Sie bereits viele Antworten erhalten. Wenn Sie jedoch nach einem regulären Ausdruck suchen, der mit ganzen Zahlen und Gleitkommazahlen übereinstimmt, funktioniert dieser für Sie:

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