2009-05-01 12 views
19

Da quando ho iniziato a scrivere questa domanda, penso di aver trovato le risposte ad ogni domanda che ho avuto, ma ho pensato di postare comunque, poiché potrebbe essere utile ad altri e maggiori chiarimenti potrebbero Sii utile.Javascript non dividerà usando regex

Stavo cercando di usare un'espressione regolare con lookahead con la funzione javascript divisa. Per qualche motivo non stava dividendo la stringa anche se trova una corrispondenza quando chiamo match. Inizialmente pensavo che il problema consistesse nell'usare lookahead nella mia espressione regolare. Ecco un esempio semplificato:

non funziona:

"aaaaBaaaa".split("(?=B)."); 

Works:

"aaaaBaaaa".match("(?=B)."); 

Appare stato che nell'esempio scissione, non è stato interpretato il problema della stringa passata come espressione regolare. L'uso delle barre in avanti invece delle virgolette sembra risolvere il problema.

"aaaaBaaaa".split(/(?=B)./); 

ho confermato la mia teoria con il seguente esempio cercando sciocco:

"aaaaaaaa(?=B).aaaaaaa".split("(?=B)."); 

Qualcun altro sembra strano che la funzione partita presuppone un'espressione regolare, mentre la funzione split non lo fa?

+0

Ho sempre usato la sintassi/regex/(senza virgolette) per tutto: corrispondenza, divisione, sostituzione. Non avevo capito che non dovevi farlo in alcuni casi. –

+2

In realtà ha senso lasciare che match() assuma un'espressione regolare (quale * altro * sarebbe possibile confrontare con?) E split() assume una stringa, poiché la divisione su una stringa è probabilmente più veloce della divisione in un'espressione regolare.Solo se si passa una regex effettiva a split(), verrà eseguita la divisione più regolare delle espressioni regolari. – Tomalak

risposta

31

String.split accetta una stringa o un'espressione regolare come primo parametro. Il metodo String.match accetta solo un'espressione regolare.

Immagino che lo String.match proverà a lavorare con tutto ciò che viene passato; quindi se passi una stringa lo interpreterà come un'espressione regolare. Il metodo String.split non ha il lusso di farlo perché può accettare stringhe di espressioni regolari E; in questo caso sarebbe sciocco ipotizzare.


Edit: (Da: "JavaScript: The Definitive Guide")

String.match richiede un'espressione regolare con cui lavorare. L'argomento passato deve essere un oggetto RegExp che specifica il modello da abbinare. Se questo argomento non è un RegExp, viene prima convertito in uno passandolo al costruttore RegExp().

3

Se ricordo correttamente (e potrei sbagliarvi qui), il metodo split è stato implementato in javascript prima che il motore regex fosse ampiamente utilizzato, quindi è presumibile che sia compatibile con le versioni precedenti.

+1

Penso che ciò valga; String.split è stato introdotto in 1.1 e Regular Expressions in 1.2. Leggendo i documenti su 'split()' (qui: http://wp.netscape.com/eng/mozilla/3.0/handbook/javascript/newfunc.htm), e i miglioramenti di regex a 'split()' qui: http : //web.archive.org/web/20010408055419/developer.netscape.com/docs/manuals/communicator/jsguide/js1_2.htm (nessun collegamento diretto, guarda sotto 'Espressioni regolari' -> 'Metodi di stringa' – Steen