Aide Regex -bonjour, j'ai juste besoin d'aide pour utiliser la fonction Regex --
La chaîne est comme --
"Bien.2020.Facultatif. (Non)"
Obligatoire -- "Fine_2020_Optional"
J'ai essayé quelques combinaisons, mais je n'ai pas réussi à obtenir le résultat en une seule expression régulière. J'utilise ce type de Regex dans mon script de boucle.
De l'aide ?
Merci.
Re : Aide Regex -Merci. C'est très utileRe : Aide Regex -@Craige_Hales Bravo x 10 ^ 6
Merci
Re : Aide Regex -Salut @Byron_JMP !
Je pourrais le faire comme ceci :
source = "(aaa).Fine.2020.Optional.(Not).more.(leave out).last.(bbb)";
//
// remove text between parens, change . to _
//
parts = {}; // accumulator list of the individual parts
ipart = 0; // index to the parts list
rc = Pat Match( // test the rc (below) to make sure the match worked
source,
patpos(0) // PatRepeat must start at the beginning.
+
Pat Repeat(
( "." | Pat Pos( 0 ) ) // advance past a required period, or begin of string
+ // followed by either...
(
( "(" + Pat Break( ")" ) + ")" )
// above: match open paren and stop on a close paren. Parens and everything
// between is rejected by not adding anything to the list of parts.
| // or
( ( Pat Break( "." ) | Pat Rem() ) >> parts[ipart += 1] )
// above: scan forward up to, but not including, a period, or if
// that doesn't work, to the end (remainder) of the string.
// ipart += 1 adds 1 before subscripting. It is OK to add an item
// to a list just beyond the end of the list. The >> operator stores
// the matched value on its left into the variable on its right.
)
)
+
patrpos(0) // PatRepeat must stop at the end.
);
// re-join the parts with the _ separator
result = if(rc,Concat Items( parts, "_" ),"problem with match");
show(result);résultat = "Fine_2020_Optional_more_last" ;
C'est assez long et assez opaque (pas aussi opaque que l'expression régulière, peut-être). Mais...
- Regex() vise vraiment à effectuer plusieurs remplacements ; GLOBALREPLACE est effectué efficacement. Vous aurez probablement besoin d'une deuxième expression régulière pour supprimer ( texte ), en utilisant également GLOBALREPLACE s'il peut y en avoir plusieurs.
- Word(), dans l'exemple de Jeff, est également bon si vous savez combien en conserver et où le (texte) apparaît . Vous ne pouvez pas le battre pour la simplicité et la maintenabilité et peut-être aussi pour la vitesse.
- PatMatch() brille ailleurs ; il s'agit en réalité d'extraire des informations, ou tout au plus de placer une chaîne à un seul emplacement (il n'y a pas de GLOBALREPLACE). L'exemple montre PatMatch() extrayant des informations pour créer une liste de pièces, puis réassemblant les pièces.
D'un autre côté, il s'agit d'une excellente introduction sur la façon d'utiliser la correspondance de modèles pour extraire des informations d'une chaîne. Le véritable avantage vient des chaînes plus longues qui peuvent être analysées en une seule correspondance (comme ci-dessus, sur une chaîne courte) car la correspondance n'a qu'une seule fois de surcharge de démarrage. En faisant parcourir la chaîne à PatRepeat en un seul passage et en ne modifiant pas la chaîne, la correspondance peut être assez rapide.
Re : Aide Regex -La correspondance de modèle pourrait également être une bonne solution, mais je continue de me tromper sur la syntaxe. Si seulement il y avait quelqu'un dans les parages qui parlait couramment le snbol... @Craige_Hales
Re : Aide Regex -N'oubliez pas les fonctions JMP intégrées pour effectuer la manipulation de chaînes, comme Remplaçant() , Munger() et, mon préféré , Mot() . La syntaxe de ceux-ci pourrait être plus facile à gérer pour quelque chose comme ça.
str="Fine.2020.Optional.(Not)";
show(substitute(str, ".", "_"));
show(word(1, str, ".") || "_" || word(2, str, ".") || "_" || word(3, str, "."));
show(concat items(words(str, ".")[1::3], "_"));
Enregistrer:
Substitute(str, ".", "_") = "Fine_2020_Optional_(Not)";
Word(1, str, ".") || "_" || Word(2, str, ".") || "_" || Word(3, str, ".") = "Fine_2020_Optional";
Concat Items(Words(str, ".")[Index(1, 3)], "_") = "Fine_2020_Optional";
Re : Aide Regex -OK, donc hors ligne, j'ai reçu quelques commentaires sur la solution très courte.
Voici comment y arriver par vous-même. C'est peut-être de la triche, mais c'est tellement plus facile.
J'ai fait un tableau avec l'exemple dedans. Sélection de la colonne et utilisation du recode.
Dans Recode, j'ai utilisé la chaîne de remplacement et activé les expressions régulières.
Dans la boîte de dialogue de recodage, j'ai activé les deux options de script (en bas à droite)
Ensuite, j'ai enregistré le script dans la fenêtre de script, copié le petit morceau et l'ai collé ici. (enfin, j'ai vérifié que cela fonctionnait, puis je l'ai collé.)
Un immense merci à @ErnestPasour : )


oh, et il y a ce petit morceau utilisant "\." plutôt que "." seul. La barre oblique inverse est un caractère d'échappement et évite de tout remplacer par "_". C'est la seule connaissance des regex nécessaire pour que cela fonctionne.
Re : Aide Regex -Expression régulière ( "c'est.jmp" , "\." , "_" , GLOBALREPLACE );
Re : Aide Regex -C'est vraiment très utile. Merci.
Re : Aide Regex -Ce site Web contient d'excellentes informations générales sur Regex :
https://www.regular-expressions.info/quickstart.html
Il existe également un outil pour générer une regex basée sur vos entrées et les sorties attendues :
http://regex.inginf.units.it/
Re : Aide Regex -Merci Paul,
Il y en a peu de plus simple, j'ai pu le faire mais c'était celui-là. ce qui m'a posé quelques ennuis. La prochaine fois, si je rencontre un problème, je vous répondrai avec plus de détails. Avez-vous une référence/un lien à partager avec moi/nous sur Regex avec de bons exemples ? Ce serait très utile.
Merci encore.Re : Aide Regex -Cela aiderait probablement si nous avions plus d'exemples d'entrée et de sortie attendue et où vous vous bloquez. Le JSL ci-dessous fonctionne pour votre seul cas, mais je ne sais pas s'il est applicable à toutes vos données en général.
Regex("Fine.2020.Optional.(Not)",
"(\w+?)\.(\d+?)\.(\w+?)\.\(\w+?\)",
"\1_\2_\3"
);