Oto wyrażenie regularne, które działa dobrze w większości implementacji wyrażeń regularnych:
(?<!filename)\.js$
To dopasowuje .js do łańcucha, który kończy się na .js, z wyjątkiem nazwy pliku.js
Javascript nie zawiera lookbehind wyrażenia regularnego. Czy ktoś jest w stanie złożyć alternatywne wyrażenie regularne, które osiąga ten sam wynik i działa w javascript?
Oto kilka myśli, ale potrzebne są funkcje pomocnicze. Miałem nadzieję, że uda mi się to osiągnąć za pomocą wyrażenia regularnego: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript
javascript
regex
daniel
źródło
źródło
(?<=thingy)thingy
do pozytywnego lookbehind a(?<!thingy)thingy
dla ujemnej lookbehind . Teraz je wspiera.Odpowiedzi:
^(?!filename).+\.js
pracuje dla mnieprzetestowany pod kątem:
Właściwe wyjaśnienie tego wyrażenia regularnego można znaleźć w Wyrażenie regularne, aby dopasować ciąg niezawierający słowa?
Funkcja Look ahead jest dostępna od wersji 1.5 javascript i jest obsługiwana przez wszystkie główne przeglądarki
Zaktualizowano, aby pasował do nazw plików2.js i 2nazwapliku.js, ale nie nazwapliku.js
(^(?!filename\.js$).).+\.js
źródło
a.js
2filename.js
, ale podane tutaj wyrażenie regularne tak. Byłby bardziej odpowiedni^(?!.*filename\.js$).*\.js$
. Oznacza to, dopasuj dowolny*.js
z wyjątkiem*filename.js
.EDYCJA: od ECMAScript 2018 asercje lookbehind (nawet bez ograniczeń) są obsługiwane natywnie .
W poprzednich wersjach możesz to zrobić:
Robi to jawnie to, co robi niejawnie wyrażenie lookbehind: sprawdź każdy znak ciągu, jeśli wyrażenie lookbehind oraz wyrażenie regularne po nim nie będą pasować, i tylko wtedy pozwól temu znakowi na dopasowanie.
Kolejna edycja:
Boli mnie, gdy mówię (zwłaszcza, że ta odpowiedź została tak bardzo pozytywnie oceniona), że istnieje znacznie łatwiejszy sposób na osiągnięcie tego celu. Nie ma potrzeby sprawdzania lookahead przy każdej postaci:
działa równie dobrze:
źródło
2filename.js
. Moje wyrażenie regularne pasuje dokładnie w tych samych przypadkach, co przykładowe wyrażenie regularne.^(?!.*filename\.js$).*\.js$
zadziała. Próbując pomyśleć o sytuacjach, w których grupa nc może być nadal potrzebna ...Załóżmy, że chcesz znaleźć wszystkie
int
nie poprzedzone przezunsigned
:Z obsługą negatywnego spojrzenia do tyłu:
Bez obsługi negatywnego spojrzenia wstecz:
Zasadniczo chodzi o to, aby pobrać n poprzedzających znaków i wykluczyć dopasowanie z ujemnym wyprzedzeniem, ale także dopasować przypadki, w których nie ma poprzedzających n znaków. (gdzie n jest długością patrzenia do tyłu).
A więc odnośne wyrażenie regularne:
przetłumaczyłoby się na:
Być może będziesz musiał bawić się grupami przechwytującymi, aby znaleźć dokładne miejsce struny, która Cię interesuje, lub nie chcesz zastąpić określonej części czymś innym.
źródło
(?<!barna)(?<!ene)(?<!en)(?<!erne) (?:sin|vår)e?(?:$| (?!egen|egne))
na(?!barna).(?!erne).(?!ene).(?!en).. (?:sin|vår)e?(?:$| (?!egen|egne))
co działa na moje potrzeby. Przedstawiam to jako kolejny scenariusz „w świecie rzeczywistym”. Zobacz link((?!unsigned ).{9}|^.{0,8})int
Jeśli możesz patrzeć przed siebie, ale wstecz, możesz najpierw odwrócić ciąg, a następnie spojrzeć w przód. Oczywiście trzeba będzie wykonać więcej pracy.
źródło
To jest odpowiednik odpowiedzi Tima Pietzckera (zobacz także komentarze do tej samej odpowiedzi):
To znaczy dopasuj
*.js
z wyjątkiem*filename.js
.Aby dostać się do tego rozwiązania, możesz sprawdzić, które wzorce wyklucza negatywne lookbehind, a następnie wykluczyć dokładnie te wzorce za pomocą negatywnego lookbehind.
źródło
Poniżej znajduje się pozytywna alternatywa dla JavaScript, pokazująca, jak przechwytywać nazwiska osób z „Michaelem” jako imieniem.
1) Biorąc pod uwagę ten tekst:
pobierz tablicę nazwisk osób o imieniu Michael. Wynik powinien być:
["Jordan","Johnson","Green","Wood"]
2) Rozwiązanie:
3) Sprawdź rozwiązanie
Demo tutaj: http://codepen.io/PiotrBerebecki/pen/GjwRoo
Możesz także wypróbować, uruchamiając poniższy fragment kodu.
źródło