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.


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.


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.


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




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!


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]

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


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.


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 .



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


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.