Reguläre Ausdrücke - passen zu allem

278

Wie mache ich einen Ausdruck, der absolut zu allem passt (einschließlich Leerzeichen)?
Beispiel:

Regex: Ich habe _____ Schafe gekauft.

Streichhölzer: Ich habe Schafe gekauft. Ich habe ein Schaf gekauft. Ich habe fünf Schafe gekauft.

Ich habe es versucht (.*), aber das scheint nicht zu funktionieren.

Update: Ich habe es zum Laufen gebracht, anscheinend lag das Problem nicht bei den regulären Ausdrücken, sondern nur darin, dass die (.) Zeichen maskiert wurden.

Gehhilfe
quelle
27
.*sollte arbeiten. Können Sie Ihren eigentlichen Code einfügen?
Jacob Eggers
2
In welcher Sprache codieren Sie?
Ziggy
9
Ein Punkt passt nicht zu einer Newline
zee

Antworten:

293

Normalerweise stimmt der Punkt mit jedem Zeichen außer Zeilenumbrüchen überein .

Wenn dies .*nicht funktioniert, setzen Sie die Option "Punkt stimmt auch mit Zeilenumbrüchen überein" (oder verwenden Sie (?s).*).

Wenn Sie JavaScript verwenden, für das keine "dotall" -Option verfügbar ist, versuchen Sie es [\s\S]*. Dies bedeutet "mit einer beliebigen Anzahl von Zeichen übereinstimmen, die entweder Leerzeichen oder Nicht-Leerzeichen sind" - effektiv "mit einer beliebigen Zeichenfolge übereinstimmen".

Eine andere Option, die nur für JavaScript funktioniert (und von keiner anderen Regex-Variante erkannt wird), ist eine, [^]*die auch mit einer Zeichenfolge übereinstimmt. Aber [\s\S]*scheint weiter verbreitet zu sein, vielleicht weil es tragbarer ist.

Tim Pietzcker
quelle
7
.*stimmt nicht überein, \naber es wird eine Zeichenfolge bearbeitet, die nur enthält, \nweil sie mit 0 Zeichen übereinstimmt.
Toto
1
Wenn Sie Javascript verwenden, vergessen Sie nicht, den Schrägstrich zu streichen, wenn Sie eine Variable auf dieses Muster setzen, z. B.: var pattern = "[\\ s \\ S] *";
Astra Bär
Die (?s).*Arbeiten für mich passten zu allem, einschließlich der neuen Linie
Gujarat Santana
1
Es gibt ein PROBLEM bei der Verwendung von / [\ s \ S] * /. Wenn Sie es in Ihrem Code verwenden und dann den Code auskommentieren, der einen Syntaxfehler verursacht, bedeutet das Ende des Musters das Ende des Kommentars. Sie müssen dieses Muster dann aus dem auskommentierten Code entfernen, damit es funktioniert. Aber wenn Sie es jemals wieder auskommentieren, funktioniert es nicht mehr oder nicht mehr so ​​wie früher und sollte.
Panu Logic
Dies wäre bei allen regulären Ausdrücken der Fall, die mit einem Sternchen enden. Natürlich ist es leicht zu vermeiden, indem Sie entweder nach *(wie in /.*(?:)/) etwas hinzufügen oder den Regex-Konstruktor ( var foo = new RegExp(".*")) verwenden.
Tim Pietzcker
177

(.*?) passt zu allem - ich benutze es seit Jahren.

jdixon2614
quelle
61
Aber passt das zu einer Newline?
Ineedahero
Ich habe dies für Sublime Text verwendet und es hat perfekt funktioniert. Vielen Dank! ("title":".*?")
SCabralO
8
Verwenden Sie in Javascript [\s\S]*oder [^]*.
Jeff Huijsmans
Ich weiß es nicht, aber jedes Mal, wenn ich diesen Ausdruck verwende, fühle ich mich schuldig, weil ich keinen bestimmten Ausdruck für meinen Anwendungsfall gemacht habe. Wenn sagen, w+ist nicht genug, am Ende benutze ich .+. Zum Glück ist ich noch nicht zurückgekommen, um mich zu beißen.
Tushar
Funktioniert für mich mit Python
Suffa
89

Wähle und merke dir 1 der folgenden !!! :) :)

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

Erläuterung:

\s: Leerzeichen \S : kein Leerzeichen

\w: Wort \W : nicht Wort

\d: Ziffer \D : keine Ziffer

(Sie können den Austausch *für , +wenn Sie 1 oder mehr Zeichen [anstelle von 0 oder mehr]).




BONUS EDIT:

Wenn Sie alles in einer einzigen Zeile abgleichen möchten, können Sie Folgendes verwenden:

[^\n]+

Erläuterung:

^: nicht

\n: Zeilenumbruch

+: für 1 Zeichen oder mehr

Tyler
quelle
21

Versuche dies:

I bought (.* )?sheep

oder auch

I bought .*sheep
Mike Mozhaev
quelle
6

Verwenden Sie .*und stellen Sie sicher, dass Sie das Äquivalent Ihrer Implementierungen für eine einzelne Zeile verwenden, damit Sie mit den Zeilenenden übereinstimmen .

Hier gibt es eine gute Erklärung -> http://www.regular-expressions.info/dot.html

Josh
quelle
4

weil . Suchen Sie ein einzelnes Zeichen, außer Zeilenumbruch oder Zeilenabschluss.

Um alles zusammenzubringen, können Sie Folgendes verwenden: (.|\n)*?

Ich hoffe es hilft!

Sang Huynh
quelle
2

(.*?)funktioniert bei mir nicht Ich versuche, Kommentare zu finden, die von /* */mehreren Zeilen umgeben sind.

Versuche dies:

([a]|[^a])

Diese Regex entspricht aoder anything else expect a. Absolut bedeutet es, alles zusammenzubringen.

Übrigens /\*([a]|[^a])*/stimmt in meiner Situation mit Kommentaren im C-Stil überein.

Vielen Dank an @mpen für eine präzisere Vorgehensweise.

[\s\S]
Oryxfea
quelle
1
Die häufigste Methode, dies in JS zu tun, ist das [\s\S]Abgleichen von Leerzeichen und Nicht-Leerzeichen.
Mpen
2

Für JavaScript scheint die beste und einfachste Antwort /.*/ zu sein.

Wie von anderen vorgeschlagen /(.*?)/ würde auch funktionieren, aber /.*/ ist einfacher. Das () innerhalb des Musters wird nicht benötigt, soweit ich sehen kann, noch das Ende? absolut alles zusammenpassen (einschließlich leerer Zeichenfolgen)

NICHT-LÖSUNGEN:

/ [\ s \ S] / stimmt NICHT mit leeren Zeichenfolgen überein, daher ist dies nicht die Lösung.

/ [\ s \ S] * / DOES stimmt auch mit leeren Zeichenfolgen überein. Aber es gibt ein Problem: Wenn Sie es in Ihrem Code verwenden, können Sie diesen Code nicht auskommentieren, da das '* /' als Ende des Kommentars interpretiert wird.

/ ([\ s \ S] *) / funktioniert und hat das Kommentarproblem nicht. Aber es ist länger und komplizierter zu verstehen als /.*/.

Panu Logic
quelle
Übrigens. Es scheint, dass die obigen Code-Auszüge dazu führen, dass Stack Overflow Teile meiner Antwort kursiv darstellt, was nicht meine Absicht war.
Panu Logic
1

Wenn Sie JavaScript verwenden, hat ES2018 das Flag s (dotAll) hinzugefügt. Mit sflag .stimmt der Punkt mit allen Zeichen überein, die Zeilenumbrüche enthalten.

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

Hinweis : In einigen Browsern wird dies noch nicht unterstützt.

Cuong Le Ngoc
quelle
1

Die Spezifikation für 2018 enthält das s-Flag (Alias: dotAll), sodass .es mit jedem Zeichen übereinstimmt, einschließlich Zeilenumbrüchen:

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

Der obige Code funktioniert in Chrome, aber das sFlag ist in Firefox noch nicht implementiert, wird aber bald verfügbar sein .

Lonnie Best
quelle
0

Ich empfehle die Verwendung /(?=.*...)/g

Beispiel

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

Verwenden Sie zum Testen regex101

Alex Montoya
quelle
0

Ehrlich gesagt sind viele der Antworten alt, daher habe ich festgestellt, dass, wenn Sie einfach eine Zeichenfolge unabhängig vom Zeicheninhalt mit "/.*/i" testen, ALLES ausreichend erhalten wird.

kjohnsonthecoder
quelle