2010-01-21 11 views
5

Ho un RegExp come il seguente esempio semplificato:Utilizzo di javascript regexp per trovare la prima e più lunga partita

var exp = /he|hell/; 

quando l'eseguo su una stringa che mi darà la prima partita, fx:

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

Voglio la prima e la più lunga corrispondenza possibile, e con questo intendo per ordine, quindi per lunghezza.

Poiché l'espressione è combinata da un array di RegExp, sto cercando un modo per trovare la corrispondenza più lunga senza dover riscrivere l'espressione regolare.

È possibile?

In caso contrario, sto cercando un modo per analizzare facilmente l'espressione e organizzarlo nell'ordine corretto. Ma io non riesco a capire come, perché le espressioni potrebbe essere molto più complessa, fx:

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

Il tuo secondo esempio sarebbe molto più interessante se fosse per esempio: '/ h .... | hel * /' –

+0

Sembra uguale a me. In realtà volevo illustrare che la regexp più lunga non era necessariamente la partita più lunga. La mia espressione semplice avrebbe dovuto essere qualcosa come '/ h. *? | Ciao /'. Ma immagino che gli utenti di questo sito sappiano cosa intendo in ogni caso. Almeno l'hai fatto :-) –

+0

Se in javascript erano possibili asserzioni lookbehind a larghezza variabile (come sono ad esempio nelle espressioni regex .NET e JGsoft) potresti ottenerlo in questo modo: 'exp = /.*(?<=h .. | hel *)/'. Ma finora questa funzione non è prevista in JS. –

risposta

2

Tutte le implementazioni regex che conosco volontà (cercare di) corrispondono a caratteri/modelli da sinistra a destra e terminano ogni volta che trovano una corrispondenza complessiva.

In altre parole: se vuoi assicurarti di ottenere la corrispondenza più lunga possibile, dovrai provare tutti i tuoi modelli (separatamente), archiviare tutte le partite e ottenere la corrispondenza più lunga tra tutte le possibili corrispondenze.

+1

Lo so. Ho modificato la domanda. Grazie per la risposta. Inizierò trovando l'indice del primo match, e quindi annuncio il^ad ogni RegExp e cercare la stringa a partire dal primo indice, in quanto alla ricerca di espressioni che non ci sono, Requres che attraversa tutto il testo. –

3

Come su /hell|he/?

+3

Non è sempre così ovvio come in questo esempio. – Jirka

+0

Semplice ma devastante. :) – zx81

1

Non è possibile eseguire "corrispondenza più lunga" (o qualsiasi cosa che contenga il conteggio, meno look-ahead) con espressioni regolari.

La soluzione migliore è trovare tutte le partite e confrontare semplicemente le lunghezze del programma.

+0

Trovando tutte le corrispondenze intendi la separazione delle espressioni regolari a | e cercando singolarmente ciascuna parte? .. (Così, invece di cercare (a | (b (c | d)), si dovrebbe guardare per 3 espressioni: a, bc, bd mi chiedo se uno deve prendere opzionalità in considerazione pure) Or c'è qualche supporto per la ricerca di tutte le partite – Jirka

+0

@ Jirka-x1: V'è il supporto per l'individuazione del * prossimo * partita; ho semplicemente dire scrivere un ciclo che passa attraverso ogni partita e tiene traccia di quali è più lunga –

+0

non sono sicuro?. a proposito di javascript, ma in Java, il tuo approccio non funziona 'Matcher m = Pattern.compile ("lui | inferno") matcher ("ciao mondo");.. while (m.find()) { System.out.println (m.group());} ' produce un unico risultato: 'lui' seconda e successive Invoca. Lezioni di find() iniziano dal primo carattere che non corrisponde alla precedente chiamata. – Jirka

0

Non so se questo è quello che stai cercando (considerando questa domanda è quasi 8 anni ...), ma ecco il mio grano di sale:

(Accensione lui per l'inferno eseguirà la ricerca basata sul più grande prima)

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]); 
} 

Dove partita [ 0] sarà il il più lungo di tutte le stringhe abbinate.

Problemi correlati