web-dev-qa-db-fra.com

Regex Match tous les caractères entre deux chaînes

Exemple: "Ceci est juste\na une phrase simple".

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

319
0xbadf00d

Par exemple

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

Regexr

J'ai utilisé lookbehind (?<=) et regarder plus loin (?=) pour que "This is" 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.

La chose importante ici est que vous activiez le mode "dotall" de votre moteur regex, de sorte que le . corresponde à la nouvelle ligne. Mais comment faire cela dépend de votre moteur de regex.

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

Mettre à jour

Regexr

This is(?s)(.*)sentence

Où (? S) active le modificateur dotall, faisant en sorte que . corresponde aux caractères de nouvelle ligne.

Mise à jour 2:

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

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

476
stema

Quantificateur nécessaire

Le fait de ressusciter cette question parce que l'expression régulière de 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 dans This is my first sentence. This is my second sentence. 

Voir démo

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

Cela correspond à ce que vous voulez:

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

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

Mode DOTALL correspondant aux coupures de ligne

Notez que dans la démo, le "mode de correspondance des lignes correspond à un point" (a.k.a.), tout est défini (voir comment activer DOTALL dans différentes langues ). Dans de nombreux types d'expression régulière, vous pouvez le définir avec le modificateur en ligne (?s), en transformant l'expression en:

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

Référence

135
zx81

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

32
kaore

Ce:

This is (.*?) sentence

fonctionne en javascript.

14

utilisez ceci: (?<=beginningstringname)(.*\n?)(?=endstringname)

13
vignesh

Au cas où quelqu'un chercherait un exemple de cela dans un contexte Jenkins. Il analyse le build.log et s'il trouve une correspondance, la construction avec la correspondance échoue.

import Java.util.regex.Matcher;
import Java.util.regex.Pattern;

node{    
    stage("parse"){
        def file = readFile 'build.log'

        def regex = ~"(?s)(firstStringToUse(.*)secondStringToUse)"
        Matcher match = regex.matcher(file)
        match.find() {
            capturedText = match.group(1)
            error(capturedText)
        }
    }
}
1
Cephos

Vous pouvez simplement utiliser ceci: \This is .*? \sentence

1
AnirbanDebnath

J'ai atterri ici dans ma recherche de regex pour convertir cette syntaxe d'impression entre print "chaîne", en Python2 dans d'anciens scripts avec: print ("chaîne"), pour Python3. Fonctionne bien, sinon utilisez 2to3.py pour des conversions supplémentaires. Voici ma solution pour les autres:

Essayez-le sur Regexr.com (ne fonctionne pas dans NP ++ pour une raison quelconque):

find:     (?<=print)( ')(.*)(')
replace: ('$2')

pour les variables:

(?<=print)( )(.*)(\n)
('$2')\n

pour label et variable:

(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n

Comment remplacer toutes les "chaînes" d'impression dans Python2 par print ("chaîne") pour Python3?

0
alchemy

Sublime Text 3x

Dans un texte sublime, vous écrivez simplement les deux mots que vous souhaitez conserver, par exemple dans votre cas

"Ceci est" et "phrase"

et vous écrivez. * entre les deux

i.e. This is .* sentence

et cela devrait vous faire du bien

0
rsc05

pour une recherche rapide dans VIM, vous pouvez utiliser à l'invite de contrôle Vim:/Ceci est.

0
vins

RegEx pour faire correspondre tout ce qui existe entre deux chaînes en utilisant l'approche Java.

List<String> results = new ArrayList<>(); //For storing results
String example = "Code will save the world";

Utilisons les objets Pattern et Matcher pour utiliser RegEx (. ?) * .

Pattern p = Pattern.compile("Code "(.*?)" world");   //Java.util.regex.Pattern;
Matcher m = p.matcher(example);                      //Java.util.regex.Matcher;

Etant donné que Matcher peut contenir plusieurs correspondances, nous devons parcourir les résultats et les stocker.

while(m.find()){   //Loop through all matches
   results.add(m.group()); //Get value and store in collection.
}

Cet exemple ne contiendra que "enregistrera le" Word, mais dans le texte plus grand, il trouvera probablement plus de correspondances.

0
Alexander

Cela a fonctionné pour moi (j'utilise VS Code ):

pour: This is just\na simple sentence

Utilisez: This .+ sentence

0
Roshna Omer

Voici comment je l'ai fait:
C’était plus facile pour moi que d’essayer de comprendre la regex spécifique nécessaire.

int indexPictureData = result.IndexOf("-PictureData:");
int indexIdentity = result.IndexOf("-Identity:");
string returnValue = result.Remove(indexPictureData + 13);
returnValue = returnValue + " [bytecoderemoved] " + result.Remove(0, indexIdentity); ` 
0
Bbb