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ć.
zapomni się uciec '/' zobaczyć go tutaj: https: // regex101 .com/r/cV1nJ0/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