2010-01-21 11 views
5

I wie das folgende vereinfachte Beispiel eine RegExp haben zu finden:javascript regexp Mit dem ersten und dem längsten Übereinstimmung

var exp = /he|hell/; 

Als ich es an einer Schnur läuft es mir das erste Spiel, fx geben:

var str = "hello world"; 
var match = exp.exec(str); 
// match contains ["he"]; 

Ich möchte die erste und längste mögliche Übereinstimmung, und damit meine ich sortiert nach Index, dann Länge.

Da der Ausdruck aus einem Array von RegExp's kombiniert wird, suche ich nach einer Möglichkeit, die längste Übereinstimmung zu finden, ohne den regulären Ausdruck neu schreiben zu müssen.

Ist das überhaupt möglich?

Wenn nicht, suche ich nach einer Möglichkeit, den Ausdruck einfach zu analysieren und in der richtigen Reihenfolge anzuordnen. Aber ich kann nicht herausfinden, wie da die Ausdrücke könnte viel komplexer sein, fx:

var exp = /h..|hel*/ 
+0

Ihr zweites Beispiel wäre viel interessanter, wenn es zum Beispiel wäre: '/ h .... | hel * /' –

+0

Es sieht genauso aus. Ich wollte eigentlich illustrieren, dass die längste Regexp nicht unbedingt die längste Übereinstimmung ist. Mein einfacher Ausdruck sollte etwas wie '/ h. *? | Hallo /' sein. Aber ich denke, die Benutzer dieser Seite wissen sowieso, was ich meine. Zumindest hast du das gemacht :-) –

+0

Wenn Lookback-Assertionen mit variabler Breite in Javascript möglich sind (wie sie zum Beispiel in den Regex-Varianten .NET und JGsoft vorkommen), könntest du es auf diese Weise erreichen: 'exp = /.*(?<=h .. | hel *)/'. Aber bis jetzt wird dieses Feature in JS nicht erwartet. –

Antwort

2

Alle Regex-Implementierungen, die ich kenne, werden (versuchen) Zeichen/Muster von links nach rechts abgleichen und beenden, wenn sie eine allgemeine Übereinstimmung finden.

Mit anderen Worten: Wenn Sie sicherstellen möchten, dass Sie die längste mögliche Übereinstimmung erhalten, müssen Sie alle Ihre Muster (separat) ausprobieren, alle Übereinstimmungen speichern und dann die längste Übereinstimmung aus allen möglichen Übereinstimmungen erhalten.

+1

Ich weiß. Ich habe die Frage bearbeitet. Danke für die Antwort. Ich werde den Index der ersten Übereinstimmung suchen und dann die^für jede RegExp anzeigen und die Teilzeichenfolge beginnend mit dem ersten Index suchen, da die Suche nach Ausdrücken, die nicht dort sind, durch den gesamten Text läuft. –

3

Wie wäre es /hell|he/?

+3

Es ist nicht immer so offensichtlich wie in diesem Beispiel. – Jirka

+0

Einfach aber verheerend. :) – zx81

1

Sie können nicht "längste Übereinstimmung" (oder etwas mit zählen, minus Look-Ahead) mit regulären Ausdrücken tun.

Am besten finden Sie alle Übereinstimmungen, und vergleichen Sie einfach die Längen im Programm.

+0

Indem Sie alle Übereinstimmungen finden, meinen Sie, die Regex bei | auseinander zu nehmen und nach jedem Teil einzeln suchen? (Anstatt also nach (a | (b (c | d)) zu suchen, müsste man nach 3 Ausdrücken suchen: a, bc, bd. Ich frage mich, ob auch die Optionalität berücksichtigt werden muss.) Or Gibt es eine Unterstützung für die Suche nach allen Übereinstimmungen? – Jirka

+0

@ Jirka-x1: Es gibt Unterstützung für die Suche nach dem * nächsten * Spiel, ich wollte nur eine Schleife schreiben, die durch jedes Spiel läuft und verfolgt, was am längsten ist. –

+0

Ich bin mir nicht sicher über Javascript, aber in Java funktioniert Ihr Ansatz nicht 'Matcher m = Pattern.compile (" er | hell "). matcher (" Hallo Welt "); while (m.find()) { System.out.println (m.group()); } ' erzeugt ein einziges Ergebnis: 'he'. Zweites und nachfolgendes Invoca find() beginnt mit dem ersten Zeichen, das nicht mit dem vorherigen Aufruf übereinstimmt. – Jirka

0

Ich weiß nicht, ob dies ist, was Sie suchen (diese Frage angesichts ist fast 8 Jahre alt ...), aber hier ist mein Salzkorn:

(Umschalten den er für die Hölle wird die Suche auf der Grundlage des größten zuerst)

var exp = /hell|he/; 
var str = "hello world"; 
var match = exp.exec(str); 

if(match) 
{ 
    match.sort(function(a, b){return b.length - a.length;});    
    console.log(match[0]); 
} 

Wo Spiel [ausführen 0] wird das sein am längsten von allen übereinstimmenden Zeichenketten.

Verwandte Themen