2015-10-05 7 views
5

mam problem z poniższego wyrażenia regularnego:

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

powyżej, spodziewam arr [2] (czyli grupa capture 2) być „plik”, dopasowanie do ostatniego znaku 4 w pierwszym wierszu po zastosowaniu chciwego. *, cofnięcie z powodu/w wzorze , a następnie zakotwiczenie na końcu linii przez $.

W rzeczywistości arr [] ma wartość zerową, co oznacza, że ​​wzór nie pasował nawet do siebie.

mogę zmienić to nieco tak robi dokładnie to, co zamierzam:

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 

Moje pytanie nie jest tak jak wiele JAK chwycić „plik” z końca pierwszej linii w s. Zamiast tego próbuję zrozumieć, DLACZEGO pierwsze wyrażenie regularne nie powiedzie się, a drugie się powiedzie. Dlaczego wartość $ nie jest zgodna z podziałem wiersza \ r \ n w przykładzie 1? Czyż nie jest to jedyny cel jego istnienia? Czy jest coś jeszcze, czego mi brakuje?

także rozważyć taką samą pierwszy wyrażenie regularne użyte w sed (z rozszerzonego trybu wyrażenia regularnego z włączoną -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 

Tutaj, grupa przechwytywania 2 przechwytuje „plik” i nic więcej. "hello" pojawia się na wyjściu, ale nie istnieje wewnątrz grupy przechwytywania, o czym świadczy pozycja łańcucha ".OUTSIDE.OF.CAPTURE.GROUP" na wyjściu. Wyrażenie regularne działa zgodnie z moim rozumieniem w sed, ale nie przy użyciu wbudowanego silnika JavaScript regexp .

Jeśli zamieniam \ r \ n w łańcuchu wejściowym na \ n, zachowanie jest identyczne dla wszystkich trzech powyższych przykładów, więc nie powinno to być istotne, o ile mogę to stwierdzić.

+0

zapomni się uciec '/' zobaczyć go tutaj: https: // regex101 .com/r/cV1nJ0/1 –

+1

Jorge: Obawiam się, że to nie to. Jak widać w twoim linku, przechwytuje "plik \ r \ nhello" dla drugiej przechwytywanej grupy, podczas gdy próbuję przechwycić tylko "plik"./nie powinno być uważane za separator, gdy jest używane w RegExp ("..."), o ile mogę to stwierdzić, ani w skrypcie sed, gdzie # jest ogranicznikiem. Mimo to dzięki. – jrsanderson

Odpowiedz

Powiązane problemy