Expressions régulières - Correspond à tout

281

Comment créer une expression qui corresponde absolument à tout (y compris les espaces blancs)?
Exemple:

Regex: J'ai acheté _____ moutons.

Allumettes: 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 n'était pas avec les expressions régulières, c'est juste que les caractères (.) Étaient échappés.

Marcheur
la source
27
.*devrait marcher. Pouvez-vous coller votre code actuel?
Jacob Eggers
2
Dans quelle langue codez-vous?
Ziggy
9
un point ne correspondra pas à une nouvelle ligne
zee

Réponses:

294

Normalement, le point correspond à n'importe quel caractère sauf les sauts de ligne .

Donc, si cela .*ne fonctionne pas, définissez l'option "le point correspond aux nouvelles lignes" (ou utilisez (?s).*).

Si vous utilisez JavaScript, qui n'a pas d'option "dotall", essayez [\s\S]*. Cela signifie "faire correspondre n'importe quel nombre de caractères qui sont soit des espaces ou des non-espaces" - en fait "correspondre à n'importe quelle chaîne".

Une autre option qui ne fonctionne que pour JavaScript (et n'est reconnue par aucune autre saveur regex) est celle [^]*qui correspond également à n'importe quelle chaîne. Mais [\s\S]*semble être plus largement utilisé, peut-être parce qu'il est plus portable.

Tim Pietzcker
la source
7
.*ne correspond pas \nmais utilise une chaîne qui ne contient que \nparce qu'elle correspond à 0 caractère.
Toto
1
si vous utilisez Javascript, n'oubliez pas de supprimer la barre oblique lors de la définition d'une variable sur ce modèle, par exemple: var pattern = "[\\ s \\ S] *";
Astra Bear
les (?s).*travaux pour moi correspondaient à tout, y compris la nouvelle ligne
Gujarat Santana
1
Il y a un PROBLÈME avec l'utilisation de / [\ s \ S] * /. Si vous l'utilisez dans votre code, puis commentez ce code qui provoque une erreur de syntaxe car la fin du modèle est considérée comme signifiant la fin du commentaire. Vous devez ensuite supprimer ce modèle du code mis en commentaire pour le faire fonctionner. Mais si jamais vous le commentez à nouveau, cela ne fonctionnera plus, ou ne fonctionnera plus comme il le faisait, et devrait.
Panu Logic
Ce serait le cas avec toute expression régulière se terminant par un astérisque. Bien sûr, il est facile d'éviter cela en ajoutant quelque chose après *(comme dans /.*(?:)/) ou en utilisant le constructeur regex ( var foo = new RegExp(".*")).
Tim Pietzcker
177

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

jdixon2614
la source
61
mais cela correspond-il à une nouvelle ligne?
ineedahero
Je l'ai utilisé sur Sublime Text et cela a parfaitement fonctionné. Merci! ("title":".*?")
SCabralO
8
En Javascript, utilisez [\s\S]*ou [^]*.
Jeff Huijsmans
Je ne sais pas, mais chaque fois que j'utilise cette expression, je me sens coupable de ne pas avoir fait d'expression spécifique pour mon cas d'utilisation. Si disons, w+ça ne suffit pas, je finis par utiliser .+. Heureusement, il n'est pas encore revenu pour me mordre.
Tushar
Fonctionne pour moi en utilisant Python
suffa
90

Choisissez et mémorisez 1 des éléments suivants !!! :)

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

Explication:

\s: espace \S: pas d'espace

\w: mot \W: pas un mot

\d: chiffre \D: pas chiffre

(Vous pouvez échanger le *pour +si vous voulez 1 ou PLUS de caractères [au lieu de 0 ou plus]).




MODIFICATION DE BONUS:

Si vous souhaitez tout faire correspondre sur une seule ligne, vous pouvez utiliser ceci:

[^\n]+

Explication:

^: ne pas

\n: saut de ligne

+: pour 1 caractère ou plus

Tyler
la source
21

Essaye ça:

I bought (.* )?sheep

ou même

I bought .*sheep
Mike Mozhaev
la source
4

Parce que .Rechercher un seul caractère, sauf la nouvelle ligne ou le terminateur de ligne.

Donc, pour faire correspondre n'importe quoi, vous pouvez utiliser comme ceci: (.|\n)*?

J'espère que ça aide!

Sang Huynh
la source
2

(.*?)ne fonctionne pas pour moi. J'essaie de faire correspondre les commentaires entourés de /* */, qui peuvent contenir plusieurs lignes.

Essaye ça:

([a]|[^a])

Cette expression régulière correspond à aou anything else expect a. Absolument, cela signifie tout assortir.

BTW, dans ma situation, /\*([a]|[^a])*/correspond aux commentaires de style C.

Merci @mpen pour une manière plus concise.

[\s\S]
oryxfea
la source
1
La façon la plus courante de le faire dans JS est [\s\S]- c'est-à-dire faire correspondre les espaces et les non-espaces.
mpen
2

Pour JavaScript, la réponse la meilleure et la plus simple semble être /.*/.

Comme suggéré par d'autres, /(.*?)/ fonctionnerait également mais /.*/ est plus simple. Les () à l'intérieur du motif ne sont pas nécessaires, autant que je puisse voir ni la fin? pour 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] * / correspond également aux chaînes vides. Mais il 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 c'est plus long et plus compliqué à comprendre que /.*/.

Panu Logic
la source
BTW. il semble que les extraits de code ci-dessus permettent à Stack Overflow de rendre les parties de ma réponse en italique, ce n'était pas mon intention.
Panu Logic
1

Si vous utilisez JavaScript, ES2018 a ajouté le drapeau s (dotAll). Avec le sdrapeau, le point .correspondra à tous les caractères, y compris les retours à la ligne.

console.log("line_1\nline_2".match(/.+/s))

Remarque : il n'est pas encore pris en charge par certains navigateurs.

Cuong Le Ngoc
la source
1

La spécification 2018 fournit l' indicateur s (alias: dotAll), de sorte qu'il .correspondra à n'importe quel caractère, y compris les sauts de ligne:

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

Le code ci-dessus fonctionne dans Chrome, mais le sdrapeau n'est pas encore implémenté dans Firefox, mais il le sera bientôt .

Lonnie Best
la source
0

Je recommande l'utilisation /(?=.*...)/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

Alex Montoya
la source
0

Honnêtement, beaucoup de réponses sont anciennes, donc j'ai trouvé que si vous testez simplement n'importe quelle chaîne quel que soit le contenu du caractère avec "/.*/i", vous obtiendrez TOUT suffisamment.

kjohnsonthecoder
la source