Jak utworzyć wyrażenie, aby dopasować absolutnie wszystko (w tym białe znaki)?
Przykład:
Regex: Kupiłem _____ owiec.
Mecze: Kupiłem owce. Kupiłem owcę. Kupiłem pięć owiec.
Próbowałem użyć (.*)
, ale to nie działa.
Aktualizacja: Uruchomiłem go, najwyraźniej problem nie dotyczył wyrażeń regularnych, po prostu znaki (.) Były ucieczkowe.
.*
powinno działać. Czy możesz wkleić swój rzeczywisty kod?Odpowiedzi:
Zwykle kropka odpowiada dowolnemu znakowi oprócz znaków nowej linii .
Jeśli więc
.*
nie działa, ustaw opcję „kropka pasuje również do nowych linii” (lub użyj(?s).*
).Jeśli używasz JavaScript, który nie ma opcji „dotall”, spróbuj
[\s\S]*
. Oznacza to „dopasuj dowolną liczbę znaków, które są albo białymi lub niebiałymi znakami” - skutecznie „dopasuj dowolny ciąg”.Inną opcją, która działa tylko dla JavaScript (i nie jest rozpoznawana przez żaden inny typ wyrażenia regularnego), jest
[^]*
także pasujący do dowolnego ciągu. Ale[\s\S]*
wydaje się, że jest szerzej stosowany, być może dlatego, że jest bardziej przenośny.źródło
.*
nie pasuje,\n
ale miszczy ciąg, który zawiera tylko\n
dlatego, że pasuje do 0 znaków.(?s).*
działa na mnie dopasowane wszystko, łącznie nowej linii*
(jak w/.*(?:)/
) lub używając konstruktora wyrażeń regularnych (var foo = new RegExp(".*")
).(.*?)
pasuje do wszystkiego - używam go od lat.źródło
("title":".*?")
[\s\S]*
lub[^]*
.w+
nie wystarczy, w końcu używam.+
. Na szczęście jeszcze nie wrócił, by mnie ugryźć.Wybierz i zapamiętaj 1 z poniższych !!! :)
Wyjaśnienie:
\s
: białe znaki\S
: nie białe znaki\w
: słowo\W
: nie słowo\d
: cyfra\D
: nie cyfra(Możesz wymienić
*
na,+
jeśli chcesz 1 lub WIĘCEJ znaków [zamiast 0 lub więcej]).EDYCJA BONUSOWA:
Jeśli chcesz dopasować wszystko w jednym wierszu, możesz użyć tego:
Wyjaśnienie:
^
: nie\n
: przerwanie linii+
: za 1 znak lub więcejźródło
Spróbuj tego:
lub nawet
źródło
Użyj
.*
i upewnij się, że używasz w swojej implementacji odpowiednika pojedynczej linii, aby dopasować zakończenia linii .Jest tu świetne wytłumaczenie -> http://www.regular-expressions.info/dot.html
źródło
Ponieważ
.
Znajdź pojedynczy znak, z wyjątkiem znaku nowej linii lub zakończenia linii.Aby dopasować cokolwiek, możesz użyć tego w następujący sposób:
(.|\n)*?
Mam nadzieję, że to pomoże!
źródło
(.*?)
nie działa dla mnie Próbuję dopasować komentarze otoczone przez/* */
, które mogą zawierać wiele wierszy.Spróbuj tego:
To wyrażenie regularne pasuje
a
lubanything else expect a
. Oczywiście, oznacza to dopasowanie wszystkiego.BTW w mojej sytuacji
/\*([a]|[^a])*/
pasuje do komentarzy w stylu C.Dziękujemy @mpen za bardziej zwięzły sposób.
źródło
[\s\S]
- tj. Dopasowywanie spacji i spacji.W przypadku JavaScript najlepszą i najprostszą odpowiedzią wydaje się być /.*/.
Jak sugerują inni /(.*?)/ też by działało, ale /.*/ jest prostsze. () Wewnątrz wzorca nie są potrzebne, o ile widzę ani zakończenia? aby dopasować absolutnie wszystko (w tym puste ciągi)
NIE ROZWIĄZANIA:
/ [\ s \ S] / NIE dopasowuje pustych ciągów, więc nie jest to rozwiązanie.
/ [\ s \ S] * / DOES dopasowuje również puste ciągi. Ale ma problem: jeśli użyjesz go w kodzie, nie możesz skomentować takiego kodu, ponieważ „* /” jest interpretowany jako koniec komentarza.
/ ([\ s \ S] *) / działa i nie ma problemu z komentarzem. Ale jest to dłuższe i bardziej skomplikowane do zrozumienia niż /.*/.
źródło
Jeśli używasz JavaScript, ES2018 dodał flagę s (dotAll). W przypadku
s
flagi kropka.
będzie pasować do dowolnych znaków, w tym nowych linii.Uwaga : nie jest jeszcze obsługiwany w niektórych przeglądarkach.
źródło
Specyfikacja 2018 zawiera flagę s (alias: dotAll), dzięki czemu
.
będzie pasować do dowolnego znaku, w tym do podziałów liniowych :Powyższy kod działa w przeglądarce Chrome, ale
s
flaga nie jest jeszcze zaimplementowana w przeglądarce Firefox, ale wkrótce .źródło
http://sandbox.phpcode.eu/g/b2243.php
źródło
Polecam użyć
/(?=.*...)/g
Przykład
Do testowania użyj regex101
źródło
Szczerze mówiąc, wiele odpowiedzi jest starych, więc stwierdziłem, że jeśli po prostu przetestujesz dowolny ciąg znaków bez względu na zawartość znaku za pomocą „/.*/i”, dostatecznie WSZYSTKO.
źródło