649 votes

Regex Faire correspondre tous les caractères entre deux chaînes de caractères

Exemple : "C'est juste \na une simple phrase".

Je veux faire correspondre chaque caractère entre "Ceci est" et "phrase". Les sauts de ligne doivent être ignorés. Je n'arrive pas à trouver la syntaxe correcte.

15 votes

Vous pourriez vouloir indiquer dans quel environnement vous utilisez Regex. Il peut y avoir des différences en fonction de ce que vous entendez exactement par "ignorer" les sauts de ligne.

975voto

stema Points 36113

Par exemple

(?<=This is)(.*)(?=sentence)

Regexr

J'ai utilisé lookbehind (?<=) et regarder vers l'avenir (?=) afin que "Ceci est" et "phrase" ne soient pas inclus dans la correspondance, mais cela dépend de votre cas d'utilisation, vous pouvez aussi simplement écrire This is(.*)sentence .

L'important ici est que vous activiez le mode "dotall" de votre moteur de regex, de sorte que la balise . correspond à la nouvelle ligne. Mais la manière de procéder dépend de votre moteur de regex.

La prochaine chose est que si vous utilisez .* ou .*? . Le premier est gourmand et correspondra jusqu'à la dernière "phrase" de votre chaîne, le second est paresseux et correspondra jusqu'à la prochaine "phrase" de votre chaîne.

Mise à jour

Regexr

This is(?s)(.*)sentence

Où le (?s) active le modificateur dotall, ce qui fait de l'élément . correspondant aux caractères de nouvelle ligne.

Mise à jour 2 :

(?<=is \()(.*?)(?=\s*\))

correspond à votre exemple "Ceci est une phrase (simple)". Voir ici Regexr

1 votes

@tchrist, désolé, j'ai dû vérifier. Est-ce que je comprends bien et This is(?s)(.*)sentence fonctionnerait ?

0 votes

@stema : Oui, cela devrait fonctionner pour activer le mode "dot all" sous la plupart des bibliothèques regex.

1 votes

Cela a en grande partie résolu mon problème, mais comment inclure un caractère d'espace blanc dans mon motif ? J'ai essayé ce qui suit : "(.* ?)( ))" pour faire correspondre le " )" à la fin d'une séquence, mais cela n'a pas fonctionné.

267voto

zx81 Points 22309

Besoin d'un quantificateur paresseux

Je ressuscite cette question parce que le regex dans la réponse acceptée ne me semble pas tout à fait correct. Pourquoi ? Parce que

(?<=This is)(.*)(?=sentence)

correspondra à my first sentence. This is my second sur This is my first sentence. This is my second sentence.

Voir la démo .

Vous avez besoin d'un quantificateur paresseux entre les deux solutions de rechange. L'ajout d'un ? rend l'étoile paresseuse.

Cela correspond à ce que vous voulez :

(?<=This is).*?(?=sentence)

Voir la démo . J'ai supprimé le groupe de capture, qui n'était pas nécessaire.

Le mode DOTALL permet de faire correspondre des lignes brisées.

Notez que dans la démo, le mode "dot matches line breaks mode" (alias) dot-all est activé (cf. comment activer DOTALL dans différentes langues ). Dans de nombreuses saveurs de regex, vous pouvez le définir avec le modificateur en ligne (?s) en transformant l'expression en :

(?s)(?<=This is).*?(?=sentence)

Référence

1 votes

Vous avez raison au sujet du groupe de capture. Je ne sais pas pourquoi j'ai fait cela. Mais la différence entre .* y .*? est également expliqué dans ma réponse (le paragraphe avant "Mise à jour"). Je ne pense donc pas que ma réponse soit incorrecte.

3 votes

@stema Désolé de pinailler, en parcourant certaines de vos réponses hier, c'est la seule qui m'a fait tiquer :) J'ai adouci la première ligne de is incorrect à doesn't seem quite correct to me ... J'espère que cela ne fait pas vous twitch, probablement juste une différence de perception sur ce que devrait être le regex pour une réponse à fort trafic.

0 votes

@zx81 (?<=exclure ceci).* ?(?=et exclure ceci) c'est une réponse fantastique merci. Je pensais que je comprenais les regex mais cela m'a poussé à faire une autre lecture sur le sujet :) chaque jour est un jour d'apprentissage :)

67voto

kaore Points 466

Essayez This is[\s\S]*?sentence fonctionne en javascript

0 votes

Comment effectuer une recherche paresseuse de cette manière ?

5 votes

@AwQiruiGuo même chose que ci-dessus. [\s\S]*? (également appelé : joker non avide)

24voto

Ceci :

This is (.*?) sentence

fonctionne en javascript.

0 votes

J'aime la simplicité, mais ce n'était pas suffisant pour moi. Ce que je veux dire, "This is just\na simple sentence".match(/This is (.*?) sentence/) a retourné null . "This is just\na simple sentence".match(/This is (.*?) sentence/s) a donné un résultat utile. La différence est le DOTALL s après la barre oblique finale.

18voto

vignesh Points 57

Utilisez ça : (?<=beginningstringname)(.*\n?)(?=endstringname)

0 votes

Je ne sais pas pourquoi tous les votes positifs, cela permet des sauts de ligne de 0 à 1, et le saut de ligne doit être immédiatement précédé de endstringname

0 votes

J'ai trouvé utile de supprimer le début des lignes de journal (timestamp etc). J'ai utilisé new line pour la chaîne de début et "at" pour la chaîne de fin.

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