2015-10-05 11 views
5

Ho un problema con la seguente espressione regolare:

var s = "http://www.google.com/dir/file\r\nhello" 
var re = new RegExp("http://([^/]+).*/([^/\r\n]+)$"); 
var arr = re.exec(s); 
alert(arr[2]); 

Sopra, mi aspetto arr [2] (cioè gruppo di cattura 2) di essere "file", corrispondenza con l'ultimo 4 caratteri nella prima riga dopo l'applicazione di un avido. *, backtracking a causa di/nel modello e quindi ancoraggio alla fine della riga di $.

Infatti, arr [] è nullo, il che implica che il modello non ha nemmeno corrispondenza.

posso modificare questa leggermente in modo che fa esattamente quello che intendo:

var s = "http://www.google.com/dir/file\r\nhello" 
var re = new RegExp("http://([^/]+).*/([^/\r\n]+)[\r\n]*"); 
var arr = re.exec(s); 
alert(arr[2]); // "file", as expected 

La mia domanda non è così la quantità di come afferrare "file" dalla fine della prima linea di s. Invece, sto cercando di capire PERCHÉ la prima regexp fallisce e il secondo ha successo. Perché $ non corrisponde alla interruzione di riga \ r \ n nell'esempio 1? non è l'unico scopo della sua esistenza? C'è qualcos'altro che mi manca?

Inoltre, si consideri la stessa prima espressione regolare come usato in sed (con estesa modalità normale espressione abilitato con -r):

$ echo -e "http://www.google.com/dir/file\r\nhello" |sed -r -e 's#http://([^/]+).*/([^/\r\n]+)$#\2.OUTSIDE.OF.CAPTURE.GROUP#' 
<<OUTPUT>> 
file.OUTSIDE.OF.CAPTURE.GROUP 
hello 

Qui, gruppo di cattura 2 cattura "file" e nient'altro. "Hello" appare nell'output, ma non esiste all'interno del gruppo di cattura , che è dimostrato dalla posizione della stringa ".OUTSIDE.OF.CAPTURE.GROUP" nell'output. Quindi l'espressione regolare funziona in base alle mie conoscenze in sed, ma non utilizza il motore regexp JavaScript incorporato .

Se sostituisco \ r \ n nella stringa di input con solo \ n, il comportamento è identico per tutti e tre gli esempi precedenti, quindi non dovrebbe essere rilevante per quanto posso dire.

+0

si dimentica di sfuggire alla '/' vederlo qui: https: // regex101 .com/r/cV1nJ0/1 –

+1

Jorge: Ho paura che non è quello. Come puoi vedere nel tuo link, questo cattura "file \ r \ nhello" per il secondo gruppo di cattura, mentre sto cercando di catturare solo "file"./non dovrebbe essere considerato un delimitatore se usato in RegExp ("...") per quanto posso dire, né nello script sed, dove # è il delimitatore. Grazie comunque comunque. – jrsanderson

risposta