Napisałem wyrażenie regularne, aby pobrać ciąg znaków z HTML, ale wygląda na to, że flaga multilinii nie działa.
To jest mój wzór i chcę uzyskać tekst w h1
tagu.
var pattern= /<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/mi
m = html.search(pattern);
return m[1];
Utworzyłem ciąg, aby go przetestować. Gdy ciąg zawiera „\ n”, wynik jest zawsze pusty. Jeśli usunąłem wszystkie „\ n”, uzyskałem właściwy wynik, bez względu na /m
flagę lub bez .
Co jest nie tak z moim wyrażeniem regularnym?
javascript
regex
Peter Mortensen
źródło
źródło
dotAll
modyfikator tak można zrobić/.../s
i twoje punkty zostaną również dopasować nowe linie. Od lipca 2017 r. Jest za flagą w Chrome.Odpowiedzi:
Szukasz
/.../s
modyfikatora, znanego również jako modyfikator dotall . Zmusza kropkę.
do dopasowywania także nowych linii, czego domyślnie nie robi .Zła wiadomość jest taka, że
nie istnieje ona w JavaScript(tak jak w ES2018, patrz poniżej) . Dobrą wiadomością jest to, że możesz obejść ten problem, używając klasy znaków (np.\s
) I jej negacji (\S
) razem, jak poniżej:Więc w twoim przypadku regex stałby się:
Począwszy od ES2018, JavaScript obsługuje
s
flagę (dotAll), więc w nowoczesnym środowisku wyrażenie regularne może wyglądać tak, jak zostało napisane, ale zs
flagą na końcu (zamiastm
;m
zmienia, jak^
i$
działa, nie.
):źródło
.
, ale dopasowanie również białych znaków (\s
) oznacza, że pasuje\n
(co.
nie działa w JavaScript lub można zrobić zs
flagą).[^]
działa również w JavaScript w celu dopasowania dowolnego znaku, w tym nowego wiersza. Zobacz developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…*?
kwantyfikatora zamiast*
w celu uniknięcia zachłanności. Pozwoli to uniknąć przechwycenia ostatniego <h1> dokumentu: prawdopodobnie nie jest to pożądane i nie jest wydajne, ponieważ wyrażenie regularne będzie szukało <h1> do końca ciągu, nawet jeśli już go wcześniej znalazło.Chcesz
s
modyfikatora (dotall), który najwyraźniej nie istnieje w Javascript - możesz go zastąpić.
[\ s \ S], jak sugeruje @molf. Wm
(multiline) modyfikator marki ^ i $ linie mecz, a nie cały ciąg.źródło
s
flagę (ES2018). :-)[\s\S]
nie działało dla mnie w nodejs 6.11.3. Opierając się na dokumentacji RegExp , mówi, aby użyć,[^]
który działa dla mnie.Na przykład:
/This is on line 1[^]*?This is on line 3/m
gdzie *? jest niechcianym chwytaniem 0 lub więcej wystąpień [^].
źródło
[^]
oznacza: to jest jak podwójna negacja: „dopasuj dowolny znak, który nie znajduje się na tej pustej liście”, a więc sprowadza się do powiedzenia „dopasuj dowolny znak” .Modyfikator dotall faktycznie przeszedł na JavaScript w czerwcu 2018 r., Czyli ECMAScript 2018.
https://github.com/tc39/proposal-regexp-dotall-flag
źródło
Moja sugestia jest taka, że lepiej jest podzielić wieloliniowy ciąg znaków za pomocą „\ n” i połączyć podziały oryginalnego łańcucha i stać się pojedynczą linią i łatwą do manipulowania.
źródło