2017-11-02 2 views
0
  • Ich habe einen regulären Ausdruck für Nummer in Englisch geschrieben passend:
    [1-9]\d{0,2}(,\d{1,3})+(\.\d+)?
    Zum Beispiel buy a sport car 1,000,000.25 wird diese Regex.
  • Ich habe auch einen regulären Ausdruck für Zahl in meiner Sprache geschrieben passenden (Vietnamese - im Grunde des , und . Symbol vertauscht)
    [1-9]\d{0,2}(\.\d{1,3})+(,\d+)?
    Zum Beispiel buy a sport car 1.000.000,25 wird diese Regex.
    Das ist, was ich will:
    1. Wenn eine Übereinstimmung Nummer die englische Nummer regex, es nicht die Vietnamesen Nummer regex übereinstimmen sollte. In einem komplizierten Fall wie diesem jedoch: buy a house 1.234.532.727,94 in October stimmt es mit beiden Regexes überein.
    2. Angesichts der Fall der Englisch Regex, konnte meine aktuelle englische Regex diese Zeichenfolge nicht übereinstimmen: 2.45 buy a song.
    3. Von dieser Zeichenfolge: buy a house 1.234.532.727,94 in October, wie kann ich diese Zeichenfolge extrahieren: 1.234.532.727,94?

Wie soll ich meine regulären Ausdrücke erhalten korrigieren, was ich will?Spiel Zahlen in verschiedenen Formaten

Antwort

1

Für den zweiten Teil Ihrer Frage, die englischen locale Regex zu machen 2.45 alles, was Sie tun müssen, ist das Komma Begriff (,\d{1,3}) optional machen:

[1-9]\d{0,2}(,\d{1,3})*(\.\d+)? 
        ^^^ change + to * 

Für Ihre erste Frage, ich glaube, Ihre separate Regexes filtern bereits nur die englischen oder vietnamesischen Gebietsschemas korrekt aus, s die zwei Demos unten. Das einzige, was ich tun musste, war, die Anker ^ und $ hinzuzufügen.

English

Vietnamese

Update:

Wenn Sie die englische locale Nummer aus dem folgenden Satz extrahieren möchten:

buy books 12.45 at school 

dann können Sie diesen Code versuchen:

var regex = /.*(?:\s+|^)([1-9]\d{0,2}(?:,\d{1,3})*(?:\.\d+)?)(?:\s+|$).*/g; 
var matches = regex.exec("buy books 12.45 at school"); 
console.log(matches[1]); 

Demo

+0

Dank! Ich habe gerade meine Frage aktualisiert. Was, wenn ich diesen Satz zusammenbringen möchte: 'kaufe einen Sportwagen 1.000.000.25' auf Englisch? Wie kann ich diese Zeichenfolge "1.000.000.25" aus dem obigen Satz extrahieren? – sonlexqt

+1

Möchten Sie genau diesen Text oder nur irgendeinen Text im Allgemeinen finden? –

+0

beliebiger Text im Allgemeinen, zum Beispiel 'kaufen Bücher 12.45 in der Schule', möchte ich' 12.45' aus dem Satz – sonlexqt

1

Wenn eine Zahl, die englische Nummer Regex übereinstimmen, sollte es nicht passen die Vietnamesisch Nummer regex

Verwenden ^ und am Ende $ für beide regex beginnen, so

/^[1-9]\d{0,2}(,\d{1,3})+(\.\d+)?$/.test("1.234.532.727,94") ; //false 

Angesichts der Fall der englischen Regex, meine aktuelle E nglish regex könnte diese Saite nicht Spiel: 2,45

Dies liegt daran, (,\d{1,3})+ mindestens eine 3-stellige Vorkommen erfordern, machen es (,\d{1,3})*

/^[1-9]\d{0,2}(,\d{1,3})*(\.\d+)?$/.test("2.45"); //true 

bearbeiten

Als @RobG hat unten aufgezeigt, wenn Sie auf Szenarien wie 0,000.123 und 0.123 aufpassen möchten, dann ersetzen Sie die ursprüngliche [1-9]\d{0,2} durch \d{1,3}

Für Beispiel

/^\d{1,3}(,\d{1,3})*(\.\d+)?$/.test("0,000.123"); //true 

/^\d{1,3}(,\d{1,3})*(\.\d+)?$/.test("0.123"); //true 

Edit 2

Falls dies ein Teil von String sein muss, dann legen eine Wortgrenze um den regulären Ausdruck anstelle von Start- und End-Symbol.

/\b\d{1,3}(,\d{1,3})*(\.\d+)?\b/.test("asd 0,000.123 sad"); //true 

^ und $ werden von \b

bearbeiten 3

Verwendung ersetzt dieser Ansatz

var input = "buy a house 1.234.532.727,94"; 
 

 
var matches = input.split(" ").filter(function(item) { return item.match(/(\d{1,3}(,\d{1,3})*(\.\d+)?)/g) }); 
 

 
console.log(matches);

+0

'^ [1-9] \ d {0,2}' sollte '^ \ d {1,3}' sein sonst Zahlen wie 0,123 scheitern wegen der führenden Null. Auch was von 0,000.123 zu machen? – RobG

+0

@RobG Danke, dass Sie darauf hingewiesen haben. – gurvinder372

+0

@ gurvinder372 Danke! Ich habe gerade meine Frage aktualisiert. Was, wenn ich diesen Satz zusammenbringen möchte: 'kaufe einen Sportwagen 1.000.000.25' auf Englisch? Wie kann ich diese Zeichenfolge "1.000.000.25" aus dem obigen Satz extrahieren? – sonlexqt

1

Die beste Regex wird zu diesem Zweck

sein
(?:^|\s)(\d{1,3}(?:,\d{3})*(?:\.\d+)?)(?!\S) 

die regex demo See.

Die (?:^|\s) entspricht dem Anfang der Zeichenfolge oder einem Leerzeichen vor der Nummer und (?!\S) prüft auf den weißen Punkt oder das Ende der Zeichenfolge nach der Zahl, ohne sie zu verbrauchen.

JS Demo:

var rx = /(?:^|\s)(\d{1,3}(?:,\d{3})*(?:\.\d+)?)(?!\S)/g; 
 
var str = "buy a sport car 1,000,000.25 1.000.000,25 2,000,000.25 3,000,000.25 test 2.45 and reject test 2,45"; 
 
var res=[], m; 
 

 
while (m = rx.exec(str)) { 
 
    res.push(m[1]); 
 
} 
 
console.log(res);

+0

Danke für Ihre Antwort! Wie kann ich in Ihrer englischen Regex-Demo (https://regex101.com/r/xrsPSx/1) 'test 2.45' akzeptieren und' test 2.45' ablehnen? – sonlexqt

+1

@sonlexqt So - ['(?:^| \ S) (\ d {1,3} (?:, \ D {3}) * (?: \. \ D +)?) (?! \ S) '] (https://regex101.com/r/xrsPSx/4) –

Verwandte Themen