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?

Malcolm
quelle

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.

meder omuraliev
quelle
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)

CMS
quelle
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 .

Chen Dachao
quelle
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

Iván Martínez
quelle
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
Andrew Moore
quelle
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.

Pete Jordan
quelle
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
var result = input.match(/\d+/g).join([])
PavelGora
quelle
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
Marmelade
quelle
2

Verwenden von Split und Regex:

    var str = "fooBar0123".split(/(\d+)/);
    console.log(str[0]); // fooBar
    console.log(str[1]); // 0123
SridharKritha
quelle
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('')

Marcelo Viana
quelle
0

Wenn Sie auch durch Punkte / Kommas getrennte Zahlen möchten, dann:

\d*\.?\d*

oder

[0-9]*\.?[0-9]*

Sie können https://regex101.com/ verwenden , um Ihre regulären Ausdrücke zu testen.

qristjan
quelle
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
Frager.
quelle