prosty searc i regexp

0

cc = "dsadsdsdsdd

tekst

";
dd = cc.replace('/

(.*)</p>/','$1');

dlaczego replace nie działa. Chciałbym wyciąć zawartość pomiędzy takami

.
Czyli jak zrobić aby w dd znalazła się wartośc "tekst"?

0

zapomniałem dać taga [javascript]

1

Wywal apostrofy wokół wyrażenia regularnego. Ono powinno być zamknięte jedynie w znakach "/". Pamiętaj też, by unieszkodliwić ten znak beksleszem w zamknięciu taga (na razie masz bezsensowny bekslesz przed <, a powinien być przed /).

0

fakt, nie zauważyłem tego. A jest jakiś modyfikator który spowoduje ignorowanie nowych linii? obecnie muszę najpierw usunac znaki nowych linii a potem wykonywac powyzsze polecenie.

1

Co to znaczy "zignorowanie znaków nowej linii"? Chodzi Ci o to, żeby to wyrażenie regularne łapało również ciągu

COŚTAM

nawet gdy COŚTAM zawiera znaki nowej linii?</p>

Jeśli tak, to teraz nie działa Ci to dlatego, że kropka dopasowuje wszystkie znaki OPRÓCZ znaków nowej linii, czyli \n (oraz \r). To poprawne zachowanie, zgodne ze specyfikacjami wyrażeń regularnych. Większość implementacji w większości językach posiada jednak opcję (np. modyfikator), dzięki której kropka dopasowuje faktycznie wszystkie znaki, łącznie ze znakami nowej linii. Niestety, w JavaScripcie nie ma takiej opcji, co bywa dość upierdliwe.

Ale łatwo to rozwiązać. Zamiast kropki należy wstawić po prostu "kropka lub \n lub \r". Ponieważ Ty masz za kropką operator *, tę alternatywę, którą chcemy wstawić, musimy ująć w nawias, żeby * dotyczył całości, a nie tylko ostatniej części alternatywy:

(.|\n|\r)

Jak ktoś chce, to może zmienić alternatywę \n|\r na oznaczający to samo zakres znaków:

(.|[\n\r])

Nie możemy w ten zakres wstawić kropki, ponieważ wewnątrz zakresu kropka oznacza po prostu kropkę, a nie "cokolwiek".

Ponieważ mamy tu nawias, z którego nie korzystamy przy replace, tj. nie napiszemy tam $2, możemy zoptymalizować wyrażenie regularne podpowiadając silnikowi, żeby nie zapisywał tego wewnętrznego nawiasu w tablicy, co robi się, zamieniając nawias (ZAWARTOŚĆ) na (?:ZAWARTOŚĆ), czyli:

(?:.|[\n\r])

Dobra, tak to wygląda tradycyjnie, prostolinijnie, technicznie. Tego można użyć zamiast kropki, by faktycznie wszystko było dopasowywane.

A teraz pokażę Ci takiego małego hacka, który w sumie już całkiem nieźle przyjął się w światku. Jak pewnie wiesz, w klasach znaków można używać ciągów jak np. \d, który oznacza cyfrę. Albo \s, który oznacza białe znaki. Nie wiem czy wiesz, ale są też negacje: \S (wielka litera S zamiast małej) oznacza wszystko OPRÓCZ białych znaków. Można więc napisać klasę znaków, która zawiera \s oraz \S i mamy tak naprawdę odhaczone WSZYSTKIE znaki, łącznie ze znakiem nowej linii:

[\s\S]

To można wstawić zamiast kropki, bez żadnych nawiasów itp. i dopasuje wszystkie znaki, łącznie ze znakami nowej linii. Poprzednie rozwiązania napisałem bardziej dla porządku i żeby Ci wyjaśnić czemu tak się dzieje.

0

wow, dzięki wielkie za kompleksowe wytłumaczenie. Myślałem, że kropka to wszystkie znaki i nie miałem pojęcia czemu nie działa. Z tymi S,s też ciekawe.

1 użytkowników online, w tym zalogowanych: 0, gości: 1