Exemple: "Ce n'est qu'une \ n simple phrase".
Je veux faire correspondre chaque caractère entre "Ceci est" et "phrase". Les sauts de ligne doivent être ignorés. Je ne peux pas comprendre la syntaxe correcte.
Exemple: "Ce n'est qu'une \ n simple phrase".
Je veux faire correspondre chaque caractère entre "Ceci est" et "phrase". Les sauts de ligne doivent être ignorés. Je ne peux pas comprendre la syntaxe correcte.
Réponses:
Par exemple
(?<=This is)(.*)(?=sentence)
J'ai utilisé lookbehind (?<=)
et look ahead (?=)
pour que "This is" et "sentence" ne soient pas inclus dans le match, mais cela dépend de votre cas d'utilisation, vous pouvez également simplement écrire 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 la façon dont vous procédez dépend de votre moteur d'expression régulière.
La prochaine chose est de savoir si vous utilisez .*
ou .*?
. Le premier est gourmand et correspondra jusqu'à la dernière "phrase" de votre chaîne, le second sera paresseux et correspondra jusqu'à la "phrase" suivante de votre chaîne.
Mise à jour
This is(?s)(.*)sentence
Où le (? S) active le modificateur dotall, ce qui fait .
correspondre les caractères de nouvelle ligne.
Mise à jour 2:
(?<=is \()(.*?)(?=\s*\))
correspond à votre exemple "Ceci est (une simple) phrase". Voir ici sur Regexr
This is(?s)(.*)sentence
fonctionnerait?
Ressusciter cette question parce que l'expression régulière de la réponse acceptée ne me semble pas tout à fait correcte. Pourquoi? Parce que
(?<=This is)(.*)(?=sentence)
correspondra my first sentence. This is my second
dansThis is my first sentence. This is my second sentence.
Vous avez besoin d'un quantificateur paresseux entre les deux contournements. L'ajout d'un ?
rend la star paresseuse.
Cela correspond à ce que vous voulez:
(?<=This is).*?(?=sentence)
Voir la démo . J'ai supprimé 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 regex, vous pouvez le définir avec le modificateur en ligne (?s)
, transformant l'expression en:
(?s)(?<=This is).*?(?=sentence)
Référence
.*
et .*?
est également expliquée dans ma réponse (le paragraphe avant "Update"). Je ne pense donc pas que ma réponse soit incorrecte.
is incorrect
à doesn't seem quite correct to me
... J'espère que cela ne vous fait pas trembler, probablement juste une différence de perception sur ce que devrait être l'expression régulière d'une réponse à fort trafic.
Essayez This is[\s\S]*sentence
, fonctionne en javascript
[\s\S]*?
(également appelé: caractère générique non gourmand)
Cette:
This is (.*?) sentence
fonctionne en javascript.
utilisez ceci: (?<=beginningstringname)(.*\n?)(?=endstringname)
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, il échoue la génération avec la correspondance.
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
Cela a fonctionné pour moi (j'utilise VS Code ):
pour:
This is just\na simple sentence
Utilisation:
This .+ sentence
Dans un texte sublime, vous écrivez simplement les deux mots que vous souhaitez conserver par exemple dans votre cas c'est
"C'est" et "phrase"
et vous écrivez. * entre les deux
c'est à dire This is .* sentence
et cela devrait vous faire du bien
Voici comment je l'ai fait:
cela a été plus facile pour moi que d'essayer de trouver le 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); `
J'ai atterri ici sur ma recherche de regex pour convertir cette syntaxe d'impression entre print "string", en Python2 dans les anciens scripts avec: print ("string"), 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 étiquette et variable:
(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n
Comment remplacer tous les "string" d'impression en Python2 par print ("string") pour Python3?
RegEx pour tout faire correspondre 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 des 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;
Étant 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 "sauvera le" mot, mais dans le plus gros texte il trouvera probablement plus de correspondances.