web-dev-qa-db-fra.com

Expressions régulières - Match n'importe quoi

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.

195
Walker

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.

221
Tim Pietzcker

(.*?) correspond à tout - je l'utilise depuis des années.

121
jdixon2614

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

69
Tyler

Essaye ça:

I bought (.* )?sheep

ou même

I bought .*sheep
13
Mike Mozhaev

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

6
Josh

(.*?) 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]
1
oryxfea

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!

1
Sang Huynh

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

1
Panu Logic

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

0
Alex Montoya

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.

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

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

0
genesis