it-swarm.com.de

Reguläre Ausdrücke - Passen Sie alles zusammen

Wie mache ich einen Ausdruck, der absolut mit allem übereinstimmt (einschließlich Leerzeichen)? 
Beispiel:

Regex: Ich kaufte _____ Schafe.

Übereinstimmungen: Ich habe Schafe gekauft. Ich habe ein Schaf gekauft. Ich habe fünf Schafe gekauft.

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

Update: Ich habe es zum Laufen gebracht, anscheinend lag das Problem nicht an den regulären Ausdrücken, es war nur so, dass die Zeichen (.) Entkommen waren.

195
Walker

Normalerweise entspricht der Punkt einem beliebigen Zeichen außer Zeilenumbrüchen

Wenn .* nicht funktioniert, setzen Sie die Option "Punkt trifft auf Zeilenumbrüche zu" (oder verwenden Sie (?s).*). 

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

Eine weitere Option, die nur für JavaScript funktioniert (und von keinem anderen Regex-Aroma erkannt wird) ist [^]*, der auch mit einer beliebigen Zeichenfolge übereinstimmt. Aber [\s\S]* scheint weiter verbreitet zu sein, vielleicht weil er portabler ist.

221
Tim Pietzcker

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

121
jdixon2614

Wähle & lerne 1 der folgenden Informationen !!! :)

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

Erklärung:

\s: Whitespace \S: nicht Whitespace

\w: Word \W: nicht Word

\d: Ziffer \D: keine Ziffer

(Sie können den * gegen + tauschen, wenn Sie 1 oder MEHR Zeichen [anstelle von 0 oder mehr] möchten).




BONUS BEARBEITEN:

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

[^\n]+

Erklärung:

^: nicht

\n: Zeilenumbruch

+: für 1 oder mehr Zeichen

69
Tyler

Versuche dies:

I bought (.* )?sheep

oder auch

I bought .*sheep
13
Mike Mozhaev

Verwenden Sie .*, und stellen Sie sicher, dass Sie das Äquivalent der einzeiligen Implementierung Ihrer Implementierungen verwenden, damit Sie mit Zeilenenden übereinstimmen.

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

6
Josh

(.*?) funktioniert nicht für mich. Ich versuche, die Kommentare, die von /* */ umgeben sind, zu vergleichen, die mehrere Zeilen enthalten können.

Versuche dies:

([a]|[^a])

Dieser reguläre Ausdruck stimmt mit a oder anything else expect a überein. Absolut bedeutet es, alles zusammenzubringen.

Übrigens, in meiner Situation entspricht /\*([a]|[^a])*/ den Kommentaren im C-Stil.

Danke @mpen für einen prägnanteren Weg.

[\s\S]
1
oryxfea

Weil . ein einzelnes Zeichen findet, außer Zeilenumbruch oder Zeilenabschluss.

Um also eine Übereinstimmung zu erzielen, können Sie Folgendes verwenden: (.|\n)*?

Ich hoffe es hilft!

1
Sang Huynh

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

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

NICHT-LÖSUNGEN:

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

/ [\ s\S] */stimmt mit leeren Zeichenfolgen überein. Es gibt jedoch ein Problem: Wenn Sie es in Ihrem Code verwenden, können Sie solchen Code nicht auskommentieren, da das '* /' als Kommentarende interpretiert wird.

/ ([\ s\S] *)/funktioniert und hat das Kommentar-Problem nicht. Es ist jedoch länger und komplizierter zu verstehen als /.*/. 

1
Panu Logic

Ich empfehle /(?=.*...)/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
Alex Montoya

Ehrlich gesagt sind viele der Antworten alt, so dass ich herausgefunden habe, dass, wenn Sie einfach eine Zeichenfolge unabhängig vom Zeicheninhalt mit "/.*/i" testen, ALLES ausreichend erhält.

0
<?php
$str = "I bought _ sheep";
preg_match("/I bought (.*?) sheep", $str, $match);
print_r($match);
?>

http://sandbox.phpcode.eu/g/b2243.php

0
genesis