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.


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.


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.


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




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!


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]

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


Ü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.


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 .



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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.