Problème de regex avec des caractères échappésJ'ai un problème avec les regex et les crochets.
Cet extrait JSL :
Show(Regex("abcdef[ghi]", "([^\[]*)\[([^\]]*)\]", "\1{\2}"))ne fonctionne pas dans JMP (14.1). Il donne l'erreur suivante :
Unexpected "([^]*)\[([^\]]*)\]", "\1{\2}"))". Perhaps there is a missing "," or ")".
Trying to parse arguments of function "Regex".Cependant, c'est une regex valide dans mon testeur de regex Perl. (J'utilise Patterns sur OS X.) Dans cet environnement, saisir :
abcdef[ghi]
à l'expression régulière
([^\[]*)\[([^\]]*)\]
en utilisant la valeur de remplacement de
$1{$2}donne le résultat
abcdef{ghi}(L'expression Perl est
$searchText =~ s/([^\[]*)\[([^\]]*)\]/$1{$2}/gism;).
Que se passe-t-il? Le moteur JMP regex a-t-il besoin d'un autre moyen d'échapper les caractères entre parenthèses ?
Merci.
Re : Problème de Regex avec les caractères échappésça marche pas non plus :
c=Regex("abcdef{:[[ghi]]:[{op},{q}]}", ":\[\[]\!007B([^\]]*)\]", "[{\1]");
Re : Problème de Regex avec les caractères échappésJ'ai fait une erreur. Écrire un code comme celui-ci ne vous donne pas le bon résultat.
c=Regex("abcdef{:[[ghi]]:[{op},{q}]}", ":\[\[]\([^\]]*)\]", "[\1]");
Re : Problème de Regex avec les caractères échappésComment gérer cette combinaison : La plage de réservations va de ":[{" début、 à fin "]".
{:[[ghi]]:[{op},{q}]}abcdefBesoin d'obtenir:
[{op},{q}]
Re : Problème de Regex avec les caractères échappésEn guise de suivi, j'ai appris quelque chose que je ne savais pas sur les regex Perl, à savoir que le moteur est suffisamment intelligent pour savoir que "[^[]" signifie "tout sauf "[". C'est-à-dire que le moteur est assez intelligent pour ne pas insister sur une barre oblique inverse avant le deuxième "[" dans ce contexte particulier. Il sait également comment interpréter "[^abc[]" correctement.
Il semble que le moteur de JMP le comprenne également.
Donc je me faisais plus de mal que nécessaire en échappant au "[".
Re : Problème de Regex avec les caractères échappésAh ! Merci à vous deux pmroz et Mark. Avec un peu de bricolage, j'ai compris comment faire ce que je veux.
1. Pour le bénéfice de l'interpréteur JSL, échappez d'abord l'intégralité de la chaîne regex en utilisant \[…]\.
2. Ensuite, pour le bénéfice du moteur Regex, échappez les crochets comme vous le feriez en Perl.
Le résultat est:
Show(Regex("abcdef[ghi]", "\[([^\[]*)\[([^\]]*)\]]\", "\1{\2}"));qui donne le résultat attendu de;
abcdef{ghi}En décomposant la chaîne, nous avons:
1. \[ pour JSL
2. [([^\[]*)\[([^\]]*)\] pour le moteur Regex (comme en Perl)
3. ]\ pour JSL
Phew!!!
Re : Problème de Regex avec les caractères échappésLe caractère barre oblique inverse est utilisé pour échapper au caractère suivant, en général, tout comme la saveur Perl, mais il désigne également des jeux de caractères spéciaux tels que \s pour les espaces ou \d pour les chiffres. Tu ne réussirais pas si tu voulais entrer s en entrant \s dans la regex. La séquence d'échappement \[ est spécial et il est associé à la fermeture ]\ séquence. Autrement dit, ce n'est pas la façon d'inclure le littéral ] personnage. Il inclura à la place la chaîne jusqu'à la séquence d'échappement de fermeture.
Voir cet exemple sous forme éclatée (quatre groupes de capture) qui illustre leur fonctionnement :
Regex(
"abcdef[ghi]",
"([^\[\[]\]*)" || "(\[\[]\)" || "([^\[\[]\]*)" || "(\[\]]\)",
"\1-\2-\3-\4"
);
Re : Problème de Regex avec les caractères échappés@pmroz est correct. JMP a fait le choix malheureux, bien avant l'ajout de la prise en charge des expressions régulières, d'autoriser le \[ ... ]\ n'importe où dans une chaîne pour signifier ignorer toutes les significations de caractères spéciaux entre les deux. Pour obtenir le texte littéral \[, il faut utiliser l'autre mécanisme d'échappement de JMP \!X, en remplaçant X par \ , pour représenter un \ qui ne se combine pas avec le [ lorsque JMP analyse le JSL. Plus tard, lorsque regex analyse le modèle, le \ est suivi du [ qui à son tour indique à regex d'ignorer la signification spéciale de [ et de le traiter comme un simple caractère.
Je réfléchis à la façon de rendre cela plus facile, merci pour le rapport !
Re : Problème de Regex avec les caractères échappésPensée intéressante. En Perl, \ n'échappe que le caractère suivant.
Mais si cela est différent dans JMP, cela devrait fonctionner :
Afficher(Regex("abcdef[ghi]", "([^\[\]*)\[\([^\]\].*)\]\", "\1{\2}"))
Malheureusement, ce n'est pas le cas :
Regex : attend ')' à la position 21 dans le modèle '([^\]*)\[\([^\].*)\]\'. dans l'accès ou l'évaluation de 'Regex' , Regex/*###*/("abcdef[ghi]", "([^\]*)\!\[\([^\].*)\]\", "\1{\2}")
Re : Problème de Regex avec les caractères échappésCela fera ce que vous voulez.J'ai dû échapper aux deux séquences d'échappement !
Show(Regex("abcdef[ghi]", "([^\[\[]\]*)\[\[]\([^\]]*)\]", "\1{\2}"));
Regex("abcdef[ghi]", "([^\!\[]*)\!\[([^\]]*)\]", "\1{\2}") = "abcdef{ghi}";Re : Problème de Regex avec les caractères échappésJe me demande si c'est parce que vous avez la séquence de caractères d'échappement "\[" dans votre chaîne.Cette séquence signifie tout traiter ensuite comme une chaîne jusqu'à ce que vous appuyiez sur "]\".
"([^ \[ ]*) \[ ([^\]]*) \] "
Re : Problème de Regex avec les caractères échappésPS Bizarrement, cela fonctionne bien dans JMP :
Show(Regex("abcdef(ghi)", "([^(]*)\(([^\)]*)\)", "\1[\2]"))donnant le bon résultat :
Regex("abcdef(ghi)", "([^(]*)\(([^\)]*)\)", "\1[\2]") = "abcdef[ghi]";Re : Problème de Regex avec les caractères échappés