Comment puis-je sélectionner le texte de | à | ? Par exemple:
I have to select | this part | and not this
J'ai essayé avec (^ | \> | \ s) \ | (\ S +) , mais de cette façon, il ne sélectionne que le premier mot .
Je dois sélectionner tous les caractères entre le premier | et le deuxième | . Avez-vous des suggestions pour y parvenir?
4 Réponses :
Vous pouvez utiliser cette expression régulière et capturer le contenu du groupe1
\|([^|]*)\|
Ici, | est un méta caractère, il doit donc être échappé. Vous démarrez le modèle en faisant correspondre un | puis capturez zéro ou plusieurs caractères autres que | et capturez-le dans le groupe1, puis faites correspondre à nouveau un | code> et récupérez votre contenu à partir du premier modèle de regroupement.
@ J.Luca: Heureux de vous aider :)
Essayez \ | (. *?) \ | . Le point d'interrogation en fait une expression non gourmande.
Essayez d'utiliser ceci:
\|(.*?[^\|])\|
Qui peut tout sélectionner sauf une nouvelle ligne et le tube (qui a une barre oblique inversée devant lui).
Les autres réponses sont excellentes si vous n'avez qu'une seule paire de | , mais que faire si vous avez plusieurs instances que vous souhaitez faire correspondre? Par exemple:
(?<=\|).*?(?=\|)
Dans l'exemple ci-dessus, il y a cinq chaînes possibles entre deux | . L'une des réponses ci-dessus ne correspondra qu'à un , trois et cinq , et ne correspondra pas à deux ou four.
À ce stade, vous vous demandez peut-être: pourquoi? La réponse est simple: le moteur regex ne peut pas faire correspondre le même texte deux fois.
Considérez ce qui se passe quand il correspond à | one | , par exemple: étant donné que | après one a déjà correspondu, et qu'il ne peut pas être mis en correspondance à nouveau, le texte restant disponible pour la correspondance est:
(?=insert_expression_here)
Notez l'absence de | avant deux . Dans ce texte restant, deux n'est clairement pas une correspondance, et donc la chaîne | trois | est en fait le prochain match. La même chose se produira avec four .
Ce dont vous avez besoin est un moyen de vérifier la présence de | , mais pas de l'inclure dans la correspondance. Cela peut être réalisé en utilisant des lookaheads et des lookbehinds . Maintenant, cela dépendra de la saveur de l'expression régulière que vous utilisez réellement fournissant ces constructions, donc votre kilométrage peut varier.
Voici à quoi ressemble un regard positif : p>
(?<=insert_expression_here)
Il essaiera de correspondre à toute expression que vous y mettez, terminant la correspondance exactement à la position actuelle dans l'expression d'origine.
Une anticipation positive fait un peu le contraire:
two | three | four | five |
Il essaiera de faire correspondre l'expression que vous y mettez, commençant la correspondance exactement au position dans l'expression d'origine.
Sachant cela, il devient clair que nous devons vérifier | au début et à la fin de la correspondance, en utilisant à la fois un lookbehind ( (? ) au début, et une anticipation ( (? = \ |) ) à la fin.
C'est ce que le l'expression finale ressemble à:
| one | two | three | four | five |
Il n'y a pas besoin de climatisation apture: le seul texte qui correspondra est le texte qui vous intéresse. Notez également que nous utilisons une expression paresseuse : en gros, au lieu d'essayer de faire correspondre autant de caractères que possible (la valeur par défaut comportement), qui correspondrait à la chaîne entière, nous voulons faire correspondre le moins de caractères possible. Cela garantira qu'il n'y a pas de caractères | parasites dans votre correspondance.
Et voici un excellent tutoriel si vous voulez en savoir plus sur les lookaheads et lookbehinds. Apprendre à les connaître vous donnera non seulement plus d'options lors de la construction d'expressions régulières, mais vous donnera également un meilleur aperçu du fonctionnement du moteur regex.
Utilisez-vous un langage de programmation?