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

8voto

Luis Febro Points 366

La solution la plus récente

Si vous utilisez Javascript, la meilleure solution que j'ai trouvée est d'utiliser match au lieu de exec méthode. Ensuite, il faut itérer les correspondances et supprimer les délimiteurs avec le résultat du premier groupe en utilisant la méthode $1

const text = "This is a test string [more or less], [more] and [less]";
const regex = /\[(.*?)\]/gi;
const resultMatchGroup = text.match(regex); // [ '[more or less]', '[more]', '[less]' ]
const desiredRes = resultMatchGroup.map(match => match.replace(regex, "$1"))
console.log("desiredRes", desiredRes); // [ 'more or less', 'more', 'less' ]

Comme vous pouvez le voir, cette méthode est également utile pour les délimiteurs multiples dans le texte.

8voto

powtac Points 18619

PHP :

$string ='This is the match [more or less]';
preg_match('#\[(.*)\]#', $string, $match);
var_dump($match[1]);

6voto

null Points 51

Celui-ci fonctionne spécifiquement pour l'analyseur d'expressions régulières de javascript. /[^[\]]+(?=])/g

exécutez simplement ceci dans la console

var regex = /[^[\]]+(?=])/g;
var str = "This is a test string [more or less]";
var match = regex.exec(str);
match;

5voto

Proka Points 116

Pour enlever aussi le [] utiliser :

\[.+\]

4voto

A. Jesús Points 73

J'ai eu le même problème en utilisant regex avec des scripts bash. J'ai utilisé une solution en 2 étapes en utilisant des pipes avec grep -o applying

 '\[(.*?)\]'  

d'abord, puis

'\b.*\b'

Évidemment pas aussi efficace que les autres réponses, mais une alternative.

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