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.
Par exemple
(?<=This is)(.*)(?=sentence)
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
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
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.
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
Essayez This is[\s\S]*sentence
, fonctionne en javascript
Ce:
This is (.*?) sentence
fonctionne en javascript.
utilisez ceci: (?<=beginningstringname)(.*\n?)(?=endstringname)
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)
}
}
}
Vous pouvez simplement utiliser ceci: \This is .*? \sentence
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?
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
pour une recherche rapide dans VIM, vous pouvez utiliser à l'invite de contrôle Vim:/Ceci est.
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.
Cela a fonctionné pour moi (j'utilise VS Code ):
pour: This is just\na simple sentence
Utilisez: This .+ sentence
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); `