Regex verwendet Javascript, um nur Zahlen zurückzugeben


129

Wenn ich eine Zeichenfolge wie "Something12" oder "Something102" habe, wie würde ich einen regulären Ausdruck in Javascript verwenden, um nur die Zahlenteile zurückzugeben?

Antworten:


226

Reguläre Ausdrücke:

var numberPattern = /\d+/g;

'something102asdfkj1948948'.match( numberPattern )

Dies würde ein Array mit zwei Elementen zurückgeben, '102' und '1948948'. Arbeiten Sie wie Sie möchten. Wenn es mit keinem übereinstimmt, wird null zurückgegeben.

Um sie zu verketten:

'something102asdfkj1948948'.match( numberPattern ).join('')

Angenommen, Sie haben es nicht mit komplexen Dezimalstellen zu tun, sollte dies wohl ausreichen.


3
irren. Ich hasse es, wählerisch zu sein, aber dies gibt ein Array zurück, kein Objekt (zumindest in Chrom).
Maus

14
Alle Arrays sind Objekte, nein?
Meder Omuraliev

6
@ MuhammadUmer - hast du es versucht?
Meder Omuraliev

2
@ Onza Sie vermissen den Backslash vor dem d, so.match(/\d+/g)
meder omuraliev

10
@ MuhammadUmer, @ meder: Ihr zwei solltet Kräfte bündeln: parseInt('987d98sf79s7f9s8f9sf'.match(/\d+/gi).join(''))
Joisey Mike

199

Sie können auch alle nichtstelligen Zeichen ( \Doder [^0-9]) entfernen :

let word_With_Numbers = 'abc123c def4567hij89'
let word_Without_Numbers = word_With_Numbers.replace(/\D/g, '');

console.log(word_Without_Numbers)


Nun, außer dass das OP "nur die Zahlenteile" will, nicht die Zeichenfolge.
Scott Fraley

24

Für Zahlen mit Dezimalbruch und Minuszeichen verwende ich dieses Snippet:

 var NUMERIC_REGEXP = /[-]{0,1}[\d]*[.]{0,1}[\d]+/g;

'2.2px 3.1px 4px -7.6px obj.key'.match(NUMERIC_REGEXP)
// return ["2.2", "3.1", "4", "-7.6"]

Update: - 09.07.2008

Es wurde ein Tool gefunden, mit dem Sie reguläre Ausdrücke visuell bearbeiten können: JavaScript Parser & Visualizer für reguläre Ausdrücke .

Aktualisieren:

Hier ist eine andere, mit der Sie sogar Regexp debuggen können: Online-Regex-Tester und Debugger .

Aktualisieren:

Ein anderer: RegExr .

Aktualisieren:

Regexper und Regex Pal .


Perfekte, einzige Lösung, die mit Dezimalstellen und negativen Zahlen funktioniert
ArmaGeddON

17

Wenn Sie nur Ziffern möchten:

var value = '675-805-714';
var numberPattern = /\d+/g;
value = value.match( numberPattern ).join([]);
alert(value);
//Show: 675805714

Jetzt werden die Ziffern zusammengefügt


9

Ich denke, Sie möchten Nummer (n) aus der Zeichenfolge erhalten. In diesem Fall können Sie Folgendes verwenden:

// Returns an array of numbers located in the string
function get_numbers(input) {
    return input.match(/[0-9]+/g);
}

var first_test = get_numbers('something102');
var second_test = get_numbers('something102or12');
var third_test = get_numbers('no numbers here!');

alert(first_test); // [102]
alert(second_test); // [102,12]
alert(third_test); // null

1
Nur um es klar zu machen, wird get_numbers/1ein Array von Zeichenfolgen zurückgegeben, nicht Zahlen. Für Ihr Beispiel würde es zurückgeben: * ["102"]* ["102", "12"]* null
Sơn Trần-Nguyễn

2

Die Antworten stimmen nicht mit Ihrer Frage überein, was eine nachfolgende Zahl impliziert . Denken Sie auch daran, dass Sie eine Zeichenfolge zurückerhalten. Wenn Sie tatsächlich eine Nummer benötigen , geben Sie das Ergebnis ein:

item=item.replace('^.*\D(\d*)$', '$1');
if (!/^\d+$/.test(item)) throw 'parse error: number not found';
item=Number(item);

Wenn Sie mit numerischen Element-IDs auf einer Webseite arbeiten, kann Ihr Code auch eine akzeptieren Elementund die Nummer aus der id(oder dem ersten übergeordneten Element mit einer id) extrahieren . Wenn Sie ein EventHandy haben, können Sie wahrscheinlich auch das bekommen Element.


Obwohl dies eine raffinierte Antwort ist, glaube ich nicht, dass die anderen Antworten "nicht wirklich mit der Frage übereinstimmen". In der Tat sind die anderen Antworten vielseitiger. Sie arbeiten sowohl mit nachgestellten Zahlen als auch mit Zahlen in der Mitte. Es ist etwas anmaßend anzunehmen, dass das OP wollte, dass es NUR mit nachgestellten Zahlen funktioniert.
Xandor


2

IMO, die Nummer 3 der Antworten von Chen Dachao, ist der richtige Weg, wenn Sie eine beliebige Zahl erfassen möchten. Der reguläre Ausdruck kann jedoch verkürzt werden aus:

/[-]{0,1}[\d]*[\.]{0,1}[\d]+/g

zu:

/-?\d*\.?\d+/g

Zum Beispiel dieser Code:

"lin-grad.ient(217deg,rgba(255, 0, 0, -0.8), rgba(-255,0,0,0) 70.71%)".match(/-?\d*\.?\d+/g)

generiert dieses Array:

["217","255","0","0","-0.8","-255","0","0","0","70.71"]

Ich habe ein Beispiel für einen linearen MDN-Verlauf geschlachtet, damit der reguläre Ausdruck vollständig getestet wird und hier nicht gescrollt werden muss. Ich denke, ich habe alle Möglichkeiten in Bezug auf negative Zahlen, Dezimalstellen, Einheitensuffixe wie deg und%, inkonsistente Komma- und Leerzeichenverwendung sowie die zusätzlichen Zeichen für Punkt / Punkt und Bindestrich / Bindestrich in den Text "lin-grad.ient" aufgenommen ". Bitte lassen Sie mich wissen, wenn mir etwas fehlt. Das einzige, was ich sehen kann, dass es nicht funktioniert, ist eine schlecht geformte Dezimalzahl wie "0..8".

Wenn Sie wirklich ein Array von Zahlen möchten, können Sie das gesamte Array in dieselbe Codezeile konvertieren:

array = whatever.match(/-?\d*\.?\d+/g).map(Number);

Mein spezieller Code, der CSS-Funktionen analysiert, muss sich nicht um die nicht numerische Verwendung des Punkt- / Punktzeichens kümmern, sodass der reguläre Ausdruck noch einfacher sein kann:

/-?[\d\.]+/g

2

Verwenden von Split und Regex:

    var str = "fooBar0123".split(/(\d+)/);
    console.log(str[0]); // fooBar
    console.log(str[1]); // 0123

1

Laut der Antwort von @ Syntle erhalten Sie eine, wenn Sie nur nicht numerische Zeichen haben Uncaught TypeError: Cannot read property 'join' of null.

Dies verhindert Fehler, wenn keine Übereinstimmungen gefunden werden, und gibt eine leere Zeichenfolge zurück:

('something'.match( /\d+/g )||[]).join('')



0

Alles, was andere Lösungen haben, aber mit ein wenig Bestätigung

// value = '675-805-714'
const validateNumberInput = (value) => { 
    let numberPattern = /\d+/g 
    let numbers = value.match(numberPattern)

    if (numbers === null) {
        return 0
    }  

    return parseInt(numbers.join([]))
}
// 675805714
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.