Regex : impossible d'obtenir toutes les parties de la chaîne qui correspondentJ'essaie d'extraire toutes les parties de la chaîne qui correspondent, mais j'utilise la correspondance regex et je n'arrive pas à obtenir le "BWA005, BWAZ006" que je veux.
ex="Select Where( :\!"BWA\!"n == \!"BWA005\!" | :\!"BWA\!"n == \!"BWAZ006\!" )";
Regex match( ex, "[\!"](BWA|BWAZ|BWAZ_)([0-9]{1,})(.*?)[\!"]" )
Automatisation et scriptsmacOSRe : Regex : impossible d'obtenir toutes les parties de la chaîne qui correspondentJe suis sûr que ce n'est pas la meilleure solution, mais Regex Match() ne semble pas faire ce que j'aimerais qu'il fasse, comme re.findall de python. Vous pouvez obtenir une liste de toutes les correspondances avec ce script brut. J'espère que quelqu'un connaît une meilleure façon.
Names Default To Here( 1 );
ex = "Select Where( :\!"BWA\!"n == \!"BWA005\!" | :\!"BWA\!"n == \!"BWAZ006\!" )";
matchlist = {};
While( !Is Missing( Regex( ex, "(BWA|BWAZ|BWAZ_)(\d{1,})" ) ),
a = Regex( ex, "(BWA|BWAZ|BWAZ_)(\d{1,})" );
Insert Into( matchlist, a );
Substitute Into( ex, a, "" );
);
Re : Regex : impossible d'obtenir toutes les parties de la chaîne qui correspondentEn fait, s'il y a des doublons que vous souhaitez voir, comme { "BWA005", "BWAZ006", "BWA005" }, vous voudriez plutôt procéder de cette façon :
Names Default To Here( 1 );
ex = "Select Where( :\!"BWA\!"n == \!"BWA005\!" | :\!"BWA\!"n == \!"BWAZ006\!" )";
matchlist = {};
While( !Is Missing( Regex( ex, "(BWA|BWAZ|BWAZ_)(\d{1,})" ) ),
a = Regex( ex, "(BWA|BWAZ|BWAZ_)(\d{1,})" );
Insert Into( matchlist, a );
b = Contains( ex, a );
c = Length( a );
ex = Substr( ex, b + c );
);Re : Regex : impossible d'obtenir toutes les parties de la chaîne qui correspondentMerci ! Ça marche!
Je veux savoir s'il existe une meilleure façon de procéder.
Re : Regex : impossible d'obtenir toutes les parties de la chaîne qui correspondentMieux pour un futur mainteneur du JSL, ou mieux pour l'ordinateur, ou une autre mesure ? Voici quelques idées ; Je penche pour la première, en partie parce que j'imagine que vous avez commencé avec une expression JSL, pas une chaîne de texte.
Une note sur les commentaires et l'observation des arbres par rapport à l'observation des forêts : mes commentaires sont au niveau des arbres. Ils ne décrivent pas votre objectif (la forêt), ils décrivent les arbres. Quiconque maintiendra votre JSL à l’avenir voudra les deux types. Un commentaire au niveau de la forêt doit expliquer pourquoi vous pensez à ces valeurs. Le niveau de l'arborescence concerne le fonctionnement d'un morceau de code non évident.
ex = "Select Where( :\!"BWA\!"n == \!"BWA005\!" | :\!"BWA\!"n == \!"BWAZ006\!" )";
// write(ex) // Select Where( :"BWA"n == "BWA005" | :"BWA"n == "BWAZ006" )
// Regex match( ex, "[\!"](BWA|BWAZ|BWAZ_)([0-9]{1,})(.*?)[\!"]" )
// desired result: "BWA005,BWAZ006"
//
// it isn't 100% clear what the rules are. These examples make different assumptions.
// assume the text is valid JSL that can be parsed back into an expression
// below, also assumes | but not & and no nested parens
expression = Parse( ex ); // Select Where( :BWA == "BWA005" | :BWA == "BWAZ006" )
// get the argument of the select where(...)
expression = Arg( expression, 1 ); // :BWA == "BWA005" | :BWA == "BWAZ006"
// assume there are only | (or) operators, change x|y|z => {x,y,z}
Substitute Into( expression, Expr( Or() ), {} ); // {:BWA == "BWA005", :BWA == "BWAZ006"}
result = {}; // accumulate answer in a result list
// process the expression list
For Each( {op}, expression, // :BWA == "BWA005" etc.
// the Right Hand Side of :BWA == "BWA005" is "BWA005"
RHS = Arg( Name Expr( op ), 2 ); // assign(:BWA,"BWA005"), want 2nd arg
// apply the test to see if this is one to keep
If( !Is Missing( Regex( RHS, "(BWA|BWAZ|BWAZ_)([0-9]+)" ) ),
Insert Into( result, Arg( op, 2 ) ); // yes: keep it in the result list
);
);
// join the list of RHS strings, separated by commas
Show( Concat Items( result, "," ) ); // Concat Items(result, ",") = "BWA005,BWAZ006";
<BR />// alternate example<BR /><BR />
// assume the strings can't collide with column names, perhaps because no
// column name has a suffix number and all strings do have a suffix number
result = {};
Pat Match(
ex,
// this is the pattern; it repeats as long as it can
Pat Repeat(
// either match the BWA... pattern, in quotes, stashing the regex match into the result:
( "\!"" + Pat Regex( "(BWA|BWAZ|BWAZ_)([0-9]+)" ) >> result[N Items( result ) + 1] + "\!"" )
// >> is the patImmediate() operator that copies the LHS match into the RHS location
// the list is initially 0 items long, and [nitems+1] extends the list by one more item
| // OR the alternative...
Pat Len( 1 ) // advance one character. This is how most of the text is matched.
)
);
Show( Concat Items( result, "," ) ); // Concat Items(result, ",") = "BWA005,BWAZ006";
// you *could* write a pattern match that would parse the text as an expression,
// but that is what the first example did.Re : Regex : impossible d'obtenir toutes les parties de la chaîne qui correspondentPour Regex Match, il y a un souhait
Ajoutez un indicateur à Regex Match() pour rechercher toutes les occurrences de pattern qui ne se chevauchent pas . En fonction de ce que vous essayez de faire (+ pourquoi et où), il existe de nombreuses options différentes pour gérer cela (pour n'en citer que quelques-unes déjà mentionnées : les boucles et la correspondance de modèles propre à jmp), mais il pourrait y avoir davantage d'options plus adaptées à votre cas d'utilisation.
Re : Regex : impossible d'obtenir toutes les parties de la chaîne qui correspondentAvec Jmp18, il est devenu beaucoup plus facile d'utiliser simplement re.findall de Python :
ex="Select Where( :\!"BWA\!"n == \!"BWA005\!" | :\!"BWA\!"n == \!"BWAZ006\!" )";
Python send(ex);
Python Submit ("
import re
matches = re.findall(r'(BWA|BWAZ)([0-9]+)',ex)
");
Python get (matches)