Regex: no se pueden obtener todas las partes de la cadena que coincidanEstoy intentando extraer todas las partes de la cadena que coinciden, pero estoy usando una coincidencia de expresiones regulares y no puedo obtener el "BWA005, BWAZ006" que quiero.
ex="Select Where( :\!"BWA\!"n == \!"BWA005\!" | :\!"BWA\!"n == \!"BWAZ006\!" )";
Regex match( ex, "[\!"](BWA|BWAZ|BWAZ_)([0-9]{1,})(.*?)[\!"]" )
Automatización y secuencias de comandosMac OSRe: Regex: no se pueden obtener todas las partes de la cadena que coincidenEstoy seguro de que esta no es la mejor solución, pero Regex Match() no parece hacer lo que me gustaría que hiciera, como re.findall de Python. Puede obtener una lista de todas las coincidencias con este sencillo script. Con suerte, alguien conoce una manera mejor.
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: no se pueden obtener todas las partes de la cadena que coincidenEn realidad, en caso de que haya duplicados que desee ver, como { "BWA005", "BWAZ006", "BWA005" }, querrá hacerlo de esta manera:
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: no se pueden obtener todas las partes de la cadena que coincidenGracias ! ¡Funciona!
Quiero saber si hay una mejor manera de hacer esto.
Re: Regex: no se pueden obtener todas las partes de la cadena que coinciden¿Mejor para un futuro mantenedor del JSL, o mejor para la computadora, o alguna otra medida? Aquí hay un par de ideas; Me inclino por la primera, en parte porque imagino que comenzaste con una expresión JSL, no con una cadena de texto.
Una nota sobre los comentarios y ver árboles frente a ver bosques: mis comentarios están a nivel de árbol. No describen tu objetivo (el bosque), describen los árboles. Cualquiera que mantenga su JSL en el futuro querrá ambos tipos. Un comentario a nivel de bosque debería explicar por qué está pensando en estos valores. El nivel de árbol trata sobre cómo funciona un fragmento de código no obvio.
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: no se pueden obtener todas las partes de la cadena que coincidenPara Regex Match hay deseo
Agregue una bandera a Regex Match() para encontrar todas las apariciones de patrón que no se superpongan . Dependiendo de lo que esté intentando hacer (+ por qué y dónde), hay muchas opciones diferentes para manejar esto (por nombrar algunas que ya se mencionaron: bucles y coincidencia de patrones propios de jmp), pero podría haber más opciones más adecuadas para su caso de uso.
Re: Regex: no se pueden obtener todas las partes de la cadena que coincidenCon Jmp18, se volvió mucho más fácil simplemente usar 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)