utiliser regex pour trouver des crochetsJ'ai un client qui souhaite extraire les chiffres des limites de spécification. Il peut le faire lorsque le texte utilise des parenthèses mais pas pour les crochets.Étant donné que les crochets, "[" et "]", sont des caractères regex spéciaux, j'ai pensé que l'utilisation du caractère d'échappement "\" ou "\\" aiderait, mais je ne pouvais pas le faire fonctionner.
Le texte qu'il recherche pourrait ressembler à [0.080, 1.20] et il veut utiliser regex pour obtenir 0.080 et 1.2.
Sa formule actuelle pour trouver les parenthèses gauches, "(" dans le texte ressemble à ceci :
Regex( :Texte, "((?<=\().+(?=\,))" )
Pour les parenthèses droites, ")", il utilise
Regex( :Texte, "((?<=\,).+(?=\)))" )
Comment ces formules peuvent-elles être modifiées pour trouver "[" ou "]" ?
Après avoir obtenu cela, il aimerait également pouvoir trouver "<", ">", "+", "-" et "+/-".
Toute aide serait appréciée.
Merci!
Re : utiliser regex pour trouver des crochetsCela me fait toujours trébucher car \[ est la séquence d'échappement pour délimiter une chaîne. Si vous l'échappez en premier, vous pouvez l'utiliser pour signifier un métacaractère regex
Num( Regex( :String, "\!\[([0-9\.eE\+\-]+)", "\1" ) )
pour le premier numéro
Num( Regex( :String, "\!\[([0-9\.eE\+\-]+)\s*,([0-9\.eE\+\-]+)", "\2" ) )
pour la seconde.
Re : utiliser regex pour trouver des crochetsSalut Charlie,
Avez-vous une idée de ce à quoi ressemble le texte? Le client peut même ne pas avoir besoin de regex. Dans les contextes où c'est le cas, le JSL résultant est souvent beaucoup plus facile à implémenter et à maintenir.
Par exemple:
Names Default To Here(1);
text = "this is a bunch of text with some data in it between brackets [2.3, 4.5] like so.";
specTxt = word(2, text, "[]");
specLo = num(word(1, specTxt, ","));
specHi = num(word(2, specTxt, ","));
show(specLo, specHi);
Re : utiliser regex pour trouver des crochetsMais pourquoi utiliser un marteau de pointage lorsqu'un marteau de 16 lb fait un plus gros coup?
Re : Utiliser regex pour trouver des crochetsA! Tellement vrai.
Re : utiliser regex pour trouver des crochetsC'est une excellente question pour l'utilisateur de poster sur le Discussions board pour voir la rapidité et la qualité des réponses qu'ils obtiendront de la communauté d'utilisateurs JMP élargie.
Pour moi personnellement, je n'ai jamais appris Regex donc je compte sur le Fonctions des personnages pour la plupart des manipulations de chaînes. En particulier, la fonction Word() fait des merveilles pour moi.
Si vous n'apprenez qu'une seule fonction de l'éditeur de formules, Word() est celle
Re : utiliser regex pour trouver des crochetsC'est une bonne idée. Je serais également curieux de voir à quelle fréquence les gens font ce que j'ai fait, répondent directement à la question, plutôt que de penser à ce que l'utilisateur essaie de faire, pour trouver une solution simple et plus élégante. Il est toujours préférable de comprendre ce dont l'utilisateur a besoin et pas nécessairement ce qu'il veut.
Re : utiliser regex pour trouver des crochetsVoici un autre exemple d'utilisation d'une expression régulière.
Names Default to Here( 1 );
// source
string = "My spec limits are [0.080,1.20] for this CQA.";
// method 1: successive calls to Regex()
lsl = Num( Regex( string, "(\d*\.?\d*),(\d*\.?\d*)", "\1" ) );
usl = Num( Regex( string, "(\d*\.?\d*),(\d*\.?\d*)", "\2" ) );
// method 2: one call to Regex Match, then convert items
limit = Regex Match( string, "(\d*\.?\d*),(\d*\.?\d*)", "\2" );
lsl = Num( limit[2] );
usl = Num( limit[3] );
Re : utiliser regex pour trouver des crochetsMerci Brady !J'ai essayé ta solution et ça marche.J'aime la simplicité.Existe-t-il un moyen d'avoir une recherche de mots pour un "[" ou un "(" ?Je pense que c'est plus proche de ce que le client recherche.
Merci encore!
Charly
Re : utiliser regex pour trouver des crochetsMerci Don!Votre solution fonctionne pour les crochets.Existe-t-il un moyen de le faire rechercher "(" ou "[" pour que cela fonctionne dans les deux cas ?
merci!
Charly
Re : utiliser regex pour trouver des crochetsMarquer-
J'ai eu un peu de mal à faire fonctionner votre solution.J'ai joint un exemple de tableau de données.Pourriez-vous jeter un coup d'œil et me dire ce que je fais mal?
merci,
Charly
Re : utiliser regex pour trouver des crochetsMerci Jeff.Je ne connais pas du tout les regex et j'essaie aussi d'utiliser les fonctions de caractères.Cependant, je voulais répondre à la question du client en utilisant une technique très similaire à la façon dont il le faisait afin qu'il puisse l'appliquer facilement.
Je l'ai encouragé à le poster sur la communauté.Nous allons voir ce qui se passe.
merci!
Charly
Re : utiliser regex pour trouver des crochetsSalut Charlie,
La fonction word() a 3 arguments, dont le dernier, le délimiteur défini, est facultatif. Il s'agit d'une chaîne entre guillemets contenant tous les délimiteurs que vous souhaitez prendre en compte. Ainsi, l'utilisateur placerait des crochets et des parenthèses dans cette chaîne.
Pour voir comment word( ) décompose une fonction, il peut être utile d'examiner ce qui est renvoyé par la fonction words(). Words() renvoie une liste de tous les fragments de texte, après délimitation.
Par exemple:
le mot (2, "Hit the road jack") renvoie "le".
word(2, "Hit the road jack", "") renvoie "i", car la chaîne vide est utilisée lorsque vous souhaitez diviser le texte en caractères individuels.
word(1, "abc/def[ghi]klm", "[]()") renvoie "abc/def"... si vous regardez les mots( "abc/def[ghi]klm", "[]()" ), vous obtiendrez
{ "abc/def", "ghi", "klm" } comme résultat.
J'espère que cela t'aides.
Acclamations,
brady
Re : utiliser regex pour trouver des crochetsSi vous voulez vraiment utiliser Regex, la chaîne suivante peut être utilisée pour le haut ou le bas
"[\!\[|\(]([0-9\.eE\+\-]+)\s*,\s*([0-9\.eE\+\-]+)"
la seule différence sera le deuxième argument, "\1" pour le bas et "\2" pour le haut. Pour comprendre ce qui se passe, pensez à l'expression comme étant en quatre parties
[\!\[|\(]
[a|b] correspondra à a ou b, les crochets et les parenthèses sont des caractères spéciaux, ils doivent donc être échappés en utilisant la barre oblique inverse. Parce que la séquence \[ est également spéciale en JSL, cela nécessite le ! pour indiquer qu'il ne s'agit pas d'une séquence spéciale.
([0-9\.eE\+\-]+)
Les parenthèses capturent l'expression qu'il contient. C'est ce à quoi le \1 fait référence. Encore une fois, les crochets sont utilisés pour désigner un jeu de caractères. Dans ce cas, il s'agit d'un ou plusieurs (en raison du + à la fin) d'un nombre, d'un point (caractère spécial échappé), d'un plus (idem), d'un moins (idem), d'un E minuscule ou majuscule. S'il y a des caractères que j'ai oubliés qui peuvent être utilisés pour signifier un nombre, mettez-les ici.
\s*,\s*
zéro ou plusieurs espaces, une virgule, zéro ou plusieurs espaces
([0-9\.eE\+\-]+)
Même expression que le premier capturé. Il est référencé par \2. Ce qui est génial, c'est qu'une fois que vous êtes arrivé aussi loin, vous pouvez vous arrêter. Pas besoin de saisir le crochet fermant ou la parenthèse (pour autant que je sache). Tu pourrais si tu le voulais.
Cela dit, j'utiliserais la solution de Brady. C'est plus succinct et plus facile à comprendre. Vous devrez ajouter la virgule dans l'ensemble de délimiteurs, c'est-à-dire,
"[(,])"
Re : utiliser regex pour trouver des crochetsVotre exemple précédent n'incluait pas d'espace après la virgule. Voici l'exemple de script corrigé :
Names Default to Here( 1 );
// source 1
string = "My spec limits are [0.080, 1.20] for this CQA.";
// method 1: successive calls to Regex()
lsl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\1" ) );
usl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" ) );
Show( lsl, usl );
// method 2: one call to Regex Match, then convert items
limit = Regex Match( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" );
lsl = Num( limit[2] );
usl = Num( limit[3] );
Show( lsl, usl );
// source 2
string = "My spec limits are (0.080, 1.20) for this CQA.";
// method 1: successive calls to Regex()
lsl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\1" ) );
usl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" ) );
Show( lsl, usl );
// method 2: one call to Regex Match, then convert items
limit = Regex Match( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" );
lsl = Num( limit[2] );
usl = Num( limit[3] );
Show( lsl, usl );
J'ai joint votre tableau de données avec les formules corrigées.
Re : utiliser regex pour trouver des crochetsCeci est un bon exemple de la façon dont Regex peut être difficile à mettre en œuvre, sans une bonne compréhension des données en dessous. La présence/l'absence d'un espace faisait la différence.
Supposons maintenant que tout format numérique légitime doive être pris en charge. Dans ce cas, le Regex deviendrait plus laid, car vous devriez tenir compte de la notation scientifique, des négatifs, des périodes (ou non), etc.
Dans de tels cas, une combinaison de fonctions JSL et Regex peut faire le travail plus facilement que l'un ou l'autre seul.
Par exemple, dans le JSL ci-dessous :
1) Remplacez les parenthèses et les parenthèses par des accolades (l'opérateur de liste... important au point 3)
2) Regex saisit les accolades et ce qu'elles contiennent, supposé être une paire de nombres légitimes dans n'importe quel format
3) Parse convertit la chaîne renvoyée par Regex en une expression JSL qui attribue le contenu de la liste à specLo et specHi.
txt = "My spec limits are [-4.087e-3, 1.20] for this CQA.";
{specLo, specHi} = Parse( Regex( Substitute( txt, "(", "{", "[", "{", ")", "}", "]", "}" ), "\\!{.*\\!}" ) );
-Brady
Re : utiliser regex pour trouver des crochetsMerci pour votre aide!