Wyrażenia regularne - dopasuj wszystko

278

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.

Piechur
źródło
27
.*powinno działać. Czy możesz wkleić swój rzeczywisty kod?
Jacob Eggers
2
W jakim języku piszesz?
Ziggy,
9
kropka nie będzie pasować do nowej linii
zee

Odpowiedzi:

293

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.

Tim Pietzcker
źródło
7
.*nie pasuje, \nale miszczy ciąg, który zawiera tylko \ndlatego, że pasuje do 0 znaków.
Toto
1
jeśli używasz Javascript, nie zapomnij o ukośniku podczas ustawiania zmiennej na ten wzorzec, np .: var pattern = "[\\ s \\ S] *";
Astra Bear
to (?s).*działa na mnie dopasowane wszystko, łącznie nowej linii
Gujarat Santana
1
Wystąpił PROBLEM z użyciem / [\ s \ S] * /. Jeśli użyjesz go w swoim kodzie, a następnie skomentujesz taki kod, który powoduje błąd składniowy, ponieważ koniec wzorca oznacza koniec komentarza. Następnie musisz usunąć ten wzorzec z skomentowanego kodu, aby działał. Ale jeśli kiedykolwiek ponownie go skomentujesz, przestanie działać lub nie będzie działał tak jak kiedyś i powinien.
Panu Logic
Tak byłoby w przypadku każdego wyrażenia regularnego kończącego się gwiazdką. Oczywiście łatwo tego uniknąć, dodając coś po *(jak w /.*(?:)/) lub używając konstruktora wyrażeń regularnych ( var foo = new RegExp(".*")).
Tim Pietzcker
177

(.*?) pasuje do wszystkiego - używam go od lat.

jdixon2614
źródło
61
ale czy to pasuje do nowej linii?
ineedahero,
Użyłem tego w Sublime Text i działało idealnie. Dzięki! ("title":".*?")
SCabralO,
8
W Javascript użyj [\s\S]*lub [^]*.
Jeff Huijsmans
Nie wiem, ale za każdym razem, gdy używam tego wyrażenia, czuję się winny, że nie stworzyłem konkretnego wyrażenia dla mojego przypadku użycia. Jeśli powiedzą, w+nie wystarczy, w końcu używam .+. Na szczęście jeszcze nie wrócił, by mnie ugryźć.
Tushar
Działa dla mnie za pomocą Pythona
suffa
89

Wybierz i zapamiętaj 1 z poniższych !!! :)

[\s\S]*
[\w\W]*
[\d\D]*

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:

[^\n]+

Wyjaśnienie:

^: nie

\n: przerwanie linii

+: za 1 znak lub więcej

Tyler
źródło
21

Spróbuj tego:

I bought (.* )?sheep

lub nawet

I bought .*sheep
Mike Mozhaev
źródło
4

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!

Sang Huynh
źródło
2

(.*?)nie działa dla mnie Próbuję dopasować komentarze otoczone przez /* */, które mogą zawierać wiele wierszy.

Spróbuj tego:

([a]|[^a])

To wyrażenie regularne pasuje alub anything 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.

[\s\S]
oryxfea
źródło
1
Najczęstszym sposobem na zrobienie tego w JS jest [\s\S]- tj. Dopasowywanie spacji i spacji.
mpen
2

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ż /.*/.

Panu Logic
źródło
BTW. Wydaje się, że powyższe fragmenty kodu powodują, że przepełnienie stosu renderuje części mojej odpowiedzi kursywą, co nie było moim zamiarem.
Panu Logic
1

Jeśli używasz JavaScript, ES2018 dodał flagę s (dotAll). W przypadku sflagi kropka .będzie pasować do dowolnych znaków, w tym nowych linii.

console.log("line_1\nline_2".match(/.+/s))

Uwaga : nie jest jeszcze obsługiwany w niektórych przeglądarkach.

Cuong Le Ngoc
źródło
1

Specyfikacja 2018 zawiera flagę s (alias: dotAll), dzięki czemu .będzie pasować do dowolnego znaku, w tym do podziałów liniowych :

const regExAll = /.*/s; //notice the 's'

let str = `
Everything
	in 	this
			string
					will
						be
	matched. Including whitespace (even Linebreaks).
`;

console.log(`Match:`, regExAll.test(str)); //true
console.log(`Index Location:`, str.search(regExAll));

let newStr = str.replace(regExAll,"🐔");
console.log(`Replaced with:`,newStr); //Index: 0

Powyższy kod działa w przeglądarce Chrome, ale sflaga nie jest jeszcze zaimplementowana w przeglądarce Firefox, ale wkrótce .

Lonnie Best
źródło
0

Polecam użyć /(?=.*...)/g

Przykład

const text1 = 'I am using regex';
/(?=.*regex)/g.test(text1) // true

const text2 = 'regex is awesome';
/(?=.*regex)/g.test(text2) // true

const text3 = 'regex is util';
/(?=.*util)(?=.*regex)/g.test(text3) // true

const text4 = 'util is necessary';
/(?=.*util)(?=.*regex)/g.test(text4) // false because need regex in text

Do testowania użyj regex101

Alex Montoya
źródło
0

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.

kjohnsonthecoder
źródło