Comment créer une expression qui correspond absolument à tout (y compris les espaces)?
Exemple:
Regex: J'ai acheté _____ mouton.
Correspondances: J'ai acheté des moutons. J'ai acheté un mouton. J'ai acheté cinq moutons.
J'ai essayé d'utiliser (.*)
, mais cela ne semble pas fonctionner.
Mise à jour: Je l'ai fait fonctionner, apparemment le problème ne concernait pas les expressions régulières, c'est simplement que les caractères (.) Ont été échappés.
Normalement, le point correspond à n’importe quel caractère sauf les nouvelles lignes .
Donc, si .*
ne fonctionne pas, définissez l'option "le point correspond également aux nouvelles lignes" (ou utilisez (?s).*
).
Si vous utilisez JavaScript, qui n'a pas l'option "dotall", essayez [\s\S]*
. Cela signifie "correspond à un nombre quelconque de caractères qui sont des espaces ou des non-espaces" - effectivement "correspond à n'importe quelle chaîne".
Une autre option qui ne fonctionne que pour JavaScript (et qui n'est reconnue par aucune autre variante d'expression régulière) est [^]*
, qui correspond également à n'importe quelle chaîne. Mais [\s\S]*
semble être plus largement utilisé, peut-être parce qu'il est plus portable.
(.*?)
correspond à tout - je l'utilise depuis des années.
Choisissez et mémorisez 1 des éléments suivants !!! :)
[\s\S]*
[\w\W]*
[\d\D]*
Explication:
\s
: espaces blancs \S
: pas d'espaces
\w
: Word \W
: pas Word
\d
: digit \D
: pas digit
(Vous pouvez échanger le *
contre +
si vous voulez 1 ou PLUS caractères [au lieu de 0 ou plus]).
EDIT BONUS:
Si vous voulez faire correspondre tout sur une seule ligne, vous pouvez utiliser ceci:
[^\n]+
Explication:
^
: pas
\n
: saut de ligne
+
: pour 1 caractère ou plus
Essaye ça:
I bought (.* )?sheep
ou même
I bought .*sheep
Utilisez .*
et assurez-vous d'utiliser l'équivalent d'une seule ligne de votre implémentation afin que vous puissiez faire correspondre les terminaisons line.
Il y a une bonne explication ici -> http://www.regular-expressions.info/dot.html
(.*?)
ne fonctionne pas pour moi. J'essaie de faire correspondre les commentaires entourés par /* */
, qui peut contenir plusieurs lignes.
Essaye ça:
([a]|[^a])
Cette expression rationnelle correspond à a
ou anything else expect a
. Absolument, cela signifie que tout va bien.
BTW, dans ma situation, /\*([a]|[^a])*/
correspond aux commentaires de style C.
Merci @mpen pour une manière plus concise.
[\s\S]
Parce que .
Recherche un seul caractère, à l'exception du caractère de fin de ligne ou de fin de ligne.
Donc, pour faire correspondre n'importe quoi, vous pouvez utiliser comme ceci: (.|\n)*?
J'espère que ça aide!
Pour JavaScript, la meilleure et la plus simple des réponses semblerait être /.*/.
Comme suggéré par d'autres, /(.*?)/ fonctionnerait aussi bien, mais /.*/ est plus simple. Les () à l'intérieur du modèle ne sont pas nécessaires, autant que je peux voir, ni la fin? faire correspondre absolument tout (y compris les chaînes vides)
NON-SOLUTIONS:
/ [\ s\S]/ne correspond PAS aux chaînes vides, ce n'est donc pas la solution.
/ [\ s\S] */NE CORRESPOND PAS aux chaînes vides. Mais il y a un problème: si vous l'utilisez dans votre code, vous ne pouvez pas commenter ce code car le '* /' est interprété comme une fin de commentaire.
/ ([\ s\S] *)/fonctionne et n'a pas le problème de commentaire. Mais il est plus long et plus compliqué à comprendre que /.*/.
Je recommande d'utiliser /(?=.*...)/g
Exemple
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
Utilisez regex101 pour tester
Honnêtement, beaucoup de réponses sont anciennes, alors j’ai trouvé que, si vous testez simplement une chaîne, quel que soit le contenu du caractère, utilisez "/.*/i" pour que TOUT soit suffisamment.
<?php
$str = "I bought _ sheep";
preg_match("/I bought (.*?) sheep", $str, $match);
print_r($match);
?>