Je dois extraire d'une chaîne un ensemble de caractères inclus entre deux délimiteurs, sans renvoyer les délimiteurs eux-mêmes.
Un exemple simple devrait être utile:
Target : extrait la sous-chaîne entre crochets, sans renvoyer les crochets eux-mêmes.
Chaîne de base : This is a test string [more or less]
Si j'utilise le reg suivant ex.
[more or less]
. Je n'ai besoin que demore or less
(sans les crochets).Est-il possible de le faire?
Facile à faire:
(?<=\[)(.*?)(?=\])
Techniquement, cela utilise des éléments antérieurs et antérieurs. Voir Lookahead et Lookbehind Zero-Width Assertions . Le motif comprend:
Sinon, vous pouvez simplement capturer ce qu'il y a entre les crochets:
\[(.*?)\]
et renvoyer le premier groupe capturé au lieu de la correspondance complète.
Si vous utilisez JavaScript, la première solution fournie par cletus, (?<=\[)(.*?)(?=\])
, ne fonctionnera pas, car JavaScript ne prend pas en charge l'opérateur lookbehind.
Cependant, la deuxième solution fonctionne bien, mais vous devez obtenir le deuxième élément correspondant.
Exemple:
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. Utilisation:
var matched = regex.exec(strToMatch)[1];
Revenir:
"more or less"
Il vous suffit de "capturer" le bit entre les crochets.
\[(.*?)\]
Pour capturer vous le mettez entre parenthèses. Vous ne dites pas quelle langue cela utilise. En Perl par exemple, vous y accéderiez en utilisant la variable $ 1.
my $string ='This is the match [more or less]';
$string =~ /\[(.*?)\]/;
print "match:$1\n";
Les autres langues auront des mécanismes différents. C #, par exemple, utilise la classe Match collection , je crois.
PHP:
$string ='This is the match [more or less]';
preg_match('#\[(.*)\]#', $string, $match);
var_dump($match[1]);
[^\[]
Faites correspondre n'importe quel caractère qui n'est pas [.
+
Match 1 ou plus de tout ce qui n'est pas [
. Crée des groupes de ces correspondances.
(?=\])
lookahead positif ]
. Correspond à un groupe se terminant par ]
sans l'inclure dans le résultat.
Terminé.
[^\[]+(?=\])
Preuve.
Similaire à la solution proposée par null. Mais le \]
supplémentaire n'est pas requis. De plus, il apparaît que \
n'est pas nécessaire pour échapper au [
après le ^
. Pour la lisibilité, je le laisserais po.
Ne fonctionne pas dans la situation dans laquelle les délimiteurs sont identiques. "more or less"
par exemple.
Celui-ci fonctionne spécifiquement pour l'analyseur d'expression régulière javascript /[^[\]]+(?=])/g
il suffit de lancer ceci dans la console
var regex = /[^[\]]+(?=])/g;
var str = "This is a test string [more or less]";
var match = regex.exec(str);
match;
Pour supprimer également le [], utilisez:
\[.+\]
J'ai eu le même problème en utilisant regex avec des scripts bash . J'ai utilisé une solution en 2 étapes utilisant des pipes avec grep -o
'\[(.*?)\]'
d'abord, puis
'\b.*\b'
Évidemment pas aussi efficace que les autres réponses, mais une alternative.
Je voulais trouver une chaîne entre/et #, mais # est parfois facultatif. Voici la regex que j'utilise:
(?<=\/)([^#]+)(?=#*)
Voici comment je me suis fait sans '[' et ']' en C #:
var text = "This is a test string [more or less]";
//Getting only string between '[' and ']'
Regex regex = new Regex(@"\[(.+?)\]");
var matchGroups = regex.Matches(text);
for (int i = 0; i < matchGroups.Count; i++)
{
Console.WriteLine(matchGroups[i].Groups[1]);
}
La sortie est:
more or less