2017-06-23 4 views
1

Was ich versuche zu erreichen:Spiel alle Zahl Vorkommen ohne Brief folgenden oder vorhergehenden

ein Beispiel String Unter der Annahme:

1 this is a1 my test 1a 12 string 12.123 whatever 1 

Ich würde eine Regex haben möchte, dass mir alles geben würde, das Auftreten von Zahlen (einschließlich Fließkommazahlen), aber ich möchte, dass es die Zahl überspringt, wenn ein Buchstabe (oder allgemeiner: eine Nicht-Zahl) vor oder nach ihm steht. So würden a1 und 1a nicht übereinstimmen.

Ich habe schon eine Weile mit diesem zu kämpfen, habe ich diesen Punkt (nicht ideal, denn es fängt auch den vorhergehenden Raum):

/(^|\s)\d*\.*\d+/g 

Aber dies wird die 1a Instanz auch fangen .. Ich könnte auch etwas Ähnliches einrichten, das würde 1a überspringen, würde aber fangen a1 ...

Kann ich dies mithilfe von Regex-Matching erreichen?

+1

Wie wäre es mit ... positiven und negativen Zahlen '+ 1' oder' -1'? Exponentielle Schreibweise '1e1'? Zifferntrennzeichen '1.000.000,00' oder' 1 000.000'? –

+0

Ich brauche nicht wirklich exponentielle Notation für diesen.Ziffertrennzeichen wäre in der Tat eine coole Ergänzung (obv abgesehen von Leerzeichen, denn diese sollten in diesem Fall als separate Zahlen behandelt werden). –

+0

Das Problem mit der Suche nach einer Zahl in einem Satz besteht darin, dass Sie nicht wissen, ob ein Punkt eine Punkt- oder Gleitkomma-Notation ist. – sln

Antwort

1

Sie können Wortgrenzen mit dieser Regex verwenden:

/(?:\.\d+|\b\d+(?:\.\d+)?)\b/g 

RegEx Demo

+0

"floats included": stimmt nicht überein mit '1.4e5' und falsch-positiv für Floats ohne Leerzeichen dazwischen: https://regex101.com/r/9QEDH8/2 –

+0

Und Sie können vorzeichenbehaftete Nummern auch z. '-1.23' stimmt nicht überein. Ich kann es sicherlich ansprechen, wenn OP irgendwelche dieser Anforderungen hat. – anubhava

+1

['[+ -]? (?: \. \ D + | \ b \ d + (?: \. \ D +)?) (?: E \ d +)? \ B'] (https://regex101.com/r/9QEDH8/3) sollte für diese Fälle funktionieren. – anubhava

0

Für eine einfache, aber nicht umfassende Lösung (. Numerischen Typen in dem gegebenen Beispiel String, keine negativen Zahlen, wissenschaftliche Schreibweise verwendet unter der Annahme, etc,), versuchen Sie dies:

\d*\.*\d+ 

Es entfernt die \s aus Deine Regex hast du entwickelt, die dem vorhergehenden Raum entspricht.

\d* werden alle Zahlen (Ziffern [0-9]) übereinstimmen.

Durch Hinzufügen von \.*\d+ werden Gleitkommazahlen abgeglichen (Dezimalzahlen gefolgt von Ziffern [0-9]).

0

Dies ist kein Regex-nur beantworten, aber vielleicht ist das eine gute Sache, wir werden sehen.

Die Regex hier in Gebrauch ist /^[-+]?(?:\d+(?:\.\d*)?|\d*\.\d+)(?:e\d+)?$/:

var testStr = '.1 this is a1 my test +5 1a 12 string -2.4 12.123 whatever . .02e1 5e5.4 1 1.4e5 1.2.3'; 
 

 
console.log('matches'); 
 
console.log(...testStr 
 
    .trim() 
 
    .split(/\s+/g) 
 
    .filter(word => /^[-+]?(?:\d+(?:\.\d*)?|\d*\.\d+)(?:e\d+)?$/ 
 
    .test(word) 
 
) 
 
); 
 

 
console.log('mismatches'); 
 
console.log(...testStr 
 
    .trim() 
 
    .split(/\s+/g) 
 
    .filter(word => !/^[-+]?(?:\d+(?:\.\d*)?|\d*\.\d+)(?:e\d+)?$/ 
 
    .test(word) 
 
) 
 
);

0

diesen Ausdruck Versuchen: (?<=^|\s)[-+]?(?:[0-9]*\.[0-9]+|[0-9]+)(?=$|\s) - Regex demo

JavaScript unterstützt: (?:^|\s)([-+]?(?:[0-9]*\.[0-9]+|[0-9]+))(?=$|\s)-Regex demo

Dieser Ausdruck su pumpt Gleitkommazahlen mit einem optionalen Zeichen.

JS unterstützt kein positives Lookbehind, daher wurde es durch nicht einfangende Gruppe ersetzt. Die Nummern werden von der 1. Gruppe erfasst.

Verwandte Themen