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.
.*
sollte arbeiten. Können Sie Ihren eigentlichen Code einfügen?Antworten:
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.quelle
.*
stimmt nicht überein,\n
aber es wird eine Zeichenfolge bearbeitet, die nur enthält,\n
weil sie mit 0 Zeichen übereinstimmt.(?s).*
Arbeiten für mich passten zu allem, einschließlich der neuen Linie*
(wie in/.*(?:)/
) etwas hinzufügen oder den Regex-Konstruktor (var foo = new RegExp(".*")
) verwenden.(.*?)
passt zu allem - ich benutze es seit Jahren.quelle
("title":".*?")
[\s\S]*
oder[^]*
.w+
ist nicht genug, am Ende benutze ich.+
. Zum Glück ist ich noch nicht zurückgekommen, um mich zu beißen.Wähle und merke dir 1 der folgenden !!! :) :)
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:
Erläuterung:
^
: nicht\n
: Zeilenumbruch+
: für 1 Zeichen oder mehrquelle
Versuche dies:
oder auch
quelle
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
quelle
weil
.
Suchen Sie ein einzelnes Zeichen, außer Zeilenumbruch oder Zeilenabschluss.Um alles zusammenzubringen, können Sie Folgendes verwenden:
(.|\n)*?
Ich hoffe es hilft!
quelle
(.*?)
funktioniert bei mir nicht Ich versuche, Kommentare zu finden, die von/* */
mehreren Zeilen umgeben sind.Versuche dies:
Diese Regex entspricht
a
oderanything 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.
quelle
[\s\S]
Abgleichen von Leerzeichen und Nicht-Leerzeichen.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 /.*/.
quelle
Wenn Sie JavaScript verwenden, hat ES2018 das Flag s (dotAll) hinzugefügt. Mit
s
flag.
stimmt der Punkt mit allen Zeichen überein, die Zeilenumbrüche enthalten.Hinweis : In einigen Browsern wird dies noch nicht unterstützt.
quelle
Die Spezifikation für 2018 enthält das s-Flag (Alias: dotAll), sodass
.
es mit jedem Zeichen übereinstimmt, einschließlich Zeilenumbrüchen:Der obige Code funktioniert in Chrome, aber das
s
Flag ist in Firefox noch nicht implementiert, wird aber bald verfügbar sein .quelle
http://sandbox.phpcode.eu/g/b2243.php
quelle
Ich empfehle die Verwendung
/(?=.*...)/g
Beispiel
Verwenden Sie zum Testen regex101
quelle
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.
quelle