Regex Correspond à tous les caractères entre deux chaînes

Exemple: “Ceci est juste 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.

Par exemple

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

Regexr

J'ai utilisé lookbehind (?< =) Et regarde devant (?=) que "This is" et "sentence" ne soit pas inclus dans la correspondance, mais cela dépend de votre cas d'utilisation, vous pouvez aussi écrire simplement This is(.*)sentence .

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

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

Mettre à jour

Regexr

 This is(?s)(.*)sentence 

Où le (?) Allume le modificateur dotall, rendant le . faire correspondre les caractères de nouvelle ligne.

Mise à jour 2:

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

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

Lazy Quantifier Needed

Ressusciter cette question car la regex dans la réponse acceptée ne me semble pas tout à fait correcte. Pourquoi? Car

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

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

Voir la démo .

Vous avez besoin d'un quantificateur paresseux entre les deux vues. Ajouter un ? rend la star paresseuse.

Cela correspond à ce que vous voulez:

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

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

Mode DOTALL pour faire correspondre les sauts de ligne

Notez que dans la démo, le "dot correspond au mode de saut de ligne" (aka) dot-all est défini (voir comment activer DOTALL dans différentes langues ). Dans de nombreuses versions 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

  • Les nombreux degrés de la cupidité des regex
  • Répétition avec Star et Plus

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

Ce:

 This is (.*?) sentence 

fonctionne en javascript.

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

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

Dans le cas où quelqu’un cherche un exemple de ceci dans un contexte Jenkins. Il parsing le build.log et s’il trouve une correspondance, il échoue à la construction avec la correspondance.

 import java.util.regex.Matcher; import java.util.regex.Pattern; node{ stage("parse"){ def file = readFile 'build.log' def regex = ~"(?s)(firstSsortingngToUse(.*)secondSsortingngToUse)" Matcher match = regex.matcher(file) match.find() { capturedText = match.group(1) error(capturedText) } } } 

Sublime Text 3x

Dans un texte sublime, vous écrivez simplement les deux mots qui vous intéressent, par exemple dans votre cas, il est

“Ceci est” et “phrase”

et vous écrivez. * entre

c’est à dire This is .* sentence

et ça devrait vous faire bien

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:"); ssortingng returnValue = result.Remove(indexPictureData + 13); returnValue = returnValue + " [bytecoderemoved] " + result.Remove(0, indexIdentity); ` 

Pour une recherche rapide dans VIM, vous pouvez utiliser à l’invite Vim Control: / This is. * \ _. * sentence