397 votes

Expression régulière pour trouver une chaîne de caractères comprise entre deux caractères en EXCLUANT les délimiteurs.

J'ai besoin d'extraire d'une chaîne de caractères un ensemble de caractères qui sont inclus entre deux délimiteurs, sans renvoyer les délimiteurs eux-mêmes.

Un exemple simple devrait être utile :

Cible : extrait la sous-chaîne entre les crochets, sans retourner les crochets eux-mêmes.

Chaîne de base : This is a test string [more or less]

Si j'utilise le registre suivant, par exemple

\\\[.\*?\\\]

Le match est [more or less] . J'ai besoin d'obtenir seulement more or less (sans les parenthèses).

Est-il possible de le faire ?

0 votes

609voto

cletus Points 276888

C'est facile :

(?<=\[)(.*?)(?=\])

Techniquement, cela revient à utiliser des lookaheads et des lookbehinds. Voir Assertions de largeur zéro Lookahead et Lookbehind . Le motif se compose de :

  • est précédé d'un [ qui n'est pas capturé (lookbehind) ;
  • un groupe capturé non avide. Il est non avide de s'arrêter au premier ] ; et
  • est suivi d'un ] qui n'est pas capturé (lookahead).

Vous pouvez aussi vous contenter de capturer ce qui se trouve entre les crochets :

\[(.*?)\]

et retourner le premier groupe capturé au lieu du match entier.

211 votes

"Facile à faire", LOL ! :) Les expressions régulières me donnent toujours mal à la tête, j'ai tendance à les oublier dès que je trouve celles qui résolvent mes problèmes. A propos de vos solutions : la première fonctionne comme prévu, la seconde non, elle continue à inclure les parenthèses. J'utilise C#, peut-être que l'objet RegEx a sa propre "saveur" de moteur regex...

6 votes

Il le fait parce que vous regardez l'ensemble de la correspondance plutôt que le premier groupe apparié.

2 votes

Cela fonctionne-t-il si la sous-chaîne contient également les délimiteurs ? Par exemple, dans This is a test string [more [or] less] ce retour more [or] less ?

70voto

Zanon Points 13171

Si vous utilisez JavaScript le solution fourni par Cletus, (?<=\[)(.*?)(?=\]) ne fonctionnera pas car JavaScript ne supporte pas l'opérateur lookbehind.

Modifier : en fait, maintenant (ES2018), il est possible d'utiliser l'opérateur lookbehind. Il suffit d'ajouter / pour définir la chaîne regex, comme ceci :

var regex = /(?<=\[)(.*?)(?=\])/;

Ancienne réponse :

Solution :

var regex = /\[(.*?)\]/;
var strToMatch = "This is a test string [more or less]";
var matched = regex.exec(strToMatch);

Il reviendra :

["[more or less]", "more or less"]

Donc, ce dont vous avez besoin est la deuxième valeur. Utilisez :

var matched = regex.exec(strToMatch)[1];

Pour revenir :

"more or less"

23voto

Xetius Points 10445

Il vous suffit de "capturer" la partie entre les crochets.

\[(.*?)\]

Pour capturer, vous le mettez entre parenthèses. Vous ne dites pas quel langage est utilisé. En Perl, par exemple, vous y accéderez en utilisant la variable $1.

my $string ='This is the match [more or less]';
$string =~ /\[(.*?)\]/;
print "match:$1\n";

D'autres langages auront des mécanismes différents. C#, par exemple, utilise la fonction Collection d'allumettes classe, je crois.

0 votes

Merci, mais cette solution n'a pas fonctionné, elle continue à inclure les crochets. Comme je l'ai écrit dans mon commentaire sur la solution de Cletus, il se pourrait que l'objet RegEx de C# l'interprète différemment. Mais je ne suis pas un expert en C#, donc c'est juste une conjecture, peut-être que c'est juste mon manque de connaissances :)

17voto

Stieneee Points 131

[^\[] Correspond à tout caractère qui n'est pas [.

+ Faites correspondre 1 ou plusieurs des éléments qui ne sont pas [ . Crée des groupes de ces correspondances.

(?=\]) Anticipation positive ] . Correspond à un groupe se terminant par ] sans l'inclure dans le résultat.

C'est fait.

[^\[]+(?=\])

Preuve.

http://regexr.com/3gobr

Similaire à la solution proposée par null. Mais l'addition \] n'est pas nécessaire. En outre, il semble que \ n'est pas nécessaire pour échapper à la [ après le ^ . Pour des raisons de lisibilité, je le laisserais en place.

Ne fonctionne pas dans la situation où les délimiteurs sont identiques. "more or less" par exemple.

15voto

user5783745 Points 1214

Voici un exemple général avec des délimiteurs évidents ( X y Y ) :

(?<=X)(.*?)(?=Y)

Ici, il est utilisé pour trouver la chaîne de caractères entre X y Y . Exemple de rubulaire aquí ou voir l'image :

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X