501 votes

Comment faire correspondre un caractère quelconque sur plusieurs lignes dans une expression régulière ?

Par exemple, cette regex

(.*)<FooBar>

correspondra :

abcde<FooBar>

Mais comment faire pour qu'elle corresponde à plusieurs lignes ?

abcde
fghij<FooBar>

1 votes

Pour clarifier, j'utilisais initialement Eclipse pour effectuer une recherche et un remplacement dans plusieurs fichiers. Ce que j'ai découvert par les réponses ci-dessous est que mon problème était l'outil et non le motif regex.

554voto

levik Points 22462

Essayez ça :

((.|\n)*)<FooBar>

Il dit essentiellement "n'importe quel caractère ou un saut de ligne" répété zéro fois ou plus.

6 votes

Cela dépend de la langue et/ou de l'outil que vous utilisez. Veuillez nous indiquer ce que vous utilisez, par exemple Perl, PHP, CF, C#, sed, awk, etc.

59 votes

En fonction de vos terminaisons de ligne, vous pouvez avoir besoin ((.|\n|\r)*)<FooBar>

3 votes

Il a dit qu'il utilisait Eclipse. À mon avis, cette solution est correcte. J'ai eu le même problème et cela l'a résolu.

291voto

Jeremy Ruten Points 59989

Cela dépend de la langue, mais il devrait y avoir un modificateur que vous pouvez ajouter au modèle regex. En PHP, c'est le cas :

/(.*)<FooBar>/s

El s à la fin fait correspondre le point tous caractères, y compris les nouvelles lignes.

0 votes

Et si je voulais juste une nouvelle ligne et pas tous les caractères ?

5 votes

@Grace : utiliser \n pour correspondre à une nouvelle ligne

0 votes

72voto

Paulo Merson Points 611

Si vous utilisez la recherche Eclipse, vous pouvez activer l'option "DOTALL" pour que '.' corresponde à n'importe quel caractère, y compris les délimiteurs de ligne : ajoutez simplement "(?s)" au début de votre chaîne de recherche. Exemple :

(?s).*<FooBar>

1 votes

Pas n'importe où, seulement dans les saveurs regex supportant les modificateurs en ligne, et certainement pas dans Ruby où (?s) => (?m)

0 votes

Quelque chose pour bash ?

0 votes

Quel est le moteur d'expression régulière sous-jacent d'Eclipse ? Quelque chose dans Java/JDK ?

44voto

Abbas Shahzadeh Points 71

Dans de nombreux dialectes de regex, /[\S\s]*<Foobar>/ fera exactement ce que vous voulez. Source :

4 votes

De ce lien : "JavaScript et VBScript ne disposent pas d'une option permettant de faire correspondre le point aux caractères de saut de ligne. Dans ces langages, vous pouvez utiliser une classe de caractères telle que [ \s\S ] pour correspondre à n'importe quel caractère." Au lieu du ., utilisez [ \s\S ] (correspond aux espaces et aux non-espaces) à la place.

41voto

samwize Points 4144

([\s\S]*)<FooBar>

Le point correspond à tout sauf aux nouvelles lignes ( \r\n ). Utilisez donc \s\S qui correspondra à TOUS les caractères.

0 votes

Cela résout le problème si vous utilisez l'Objective-C. [text rangeOfString:regEx options:NSRegularExpressionSearch] . Merci !

2 votes

Cela fonctionne dans le regex find&replace d'intelliJ, merci.

1 votes

Cela fonctionne. Mais il faut que ce soit la première occurrence de <FooBar>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X