Desafío JSLEstoy tratando de encontrar una forma sencilla y elegante de buscar en una cadena de texto todas las apariciones de un patrón determinado y obtener sus posiciones sin utilizar un bucle. Munger me dirá cuántos hay, pero no dónde están. Se me ocurren algunas opciones, pero siento que me estoy perdiendo algo.
Re: JSL ChallengeParece una idea de libro de cocina.
https://community.jmp.com/t5/JSL-Cookbook/Search-a-string-for-all-occurrences-of-a-pattern/ta-p/79761
Re: JSL ChallengeAh ok Sólo me preguntaba. He tenido personas que hacen una pregunta similar pero en términos de aminoácidos o bases dentro de una columna y mencioné que BLAST y otras herramientas similares son un lugar mejor para este tipo de pregunta. He tenido algunas personas que buscan cadenas específicas dentro de una columna de texto (como comentarios, por ejemplo). Pero el Explorador de texto ahora llenaría ese vacío para esos tipos de preguntas (dadas las palabras de parada, etc.)Re: JSL ChallengeHonestamente, esta es solo una pregunta general en la que pensé en el proceso de hacer algo similar. Sé que me he topado con el problema en el pasado, pero puedo recordar el contexto. De manera similar, me gustaría poder listar cadenas de texto que identifican aquellos elementos que contienen una cadena de destino (sin tener que usar un bucle).
Re: JSL ChallengeHola don
¿Para qué problema estás buscando resolver con este desafío JSL? Espero que no sea una genómica. Existe una herramienta llamada BLAST que la gente usa para encontrar secuencias que hace algo similar con cierta lógica difusa incluida, así como un mecanismo de puntuación.
Si solo para la exploración de texto, no estoy muy seguro de esto. Supongo que es como usar un comando de búsqueda en Word, TextPad, PDF Viewer o navegador web que busca una cadena en un corpus de texto y te dice una ubicación de lo que encontró. SI es así, ¿por qué no usar esas herramientas en lugar de reinventar la rueda con JSL? ¿O usar el Explorador de texto y forzarlo a buscar lo que quieres?
Solo tratando de entender el contexto.
Chris
Re: JSL Challenge
Me di cuenta de que esto no funcionará hasta que ajuste las posiciones para el hecho de que cambió una cadena de longitud k a una cadena de 1 longitud. Por lo tanto, si la subcadena tenía más de 1 carácter, las posiciones deben ajustarse. De ahí la última cláusula "si".
str = "acdljkdfjhcdlkjgiucdlekjrfcdcd";
substr = "cd";
pos = loc(words(substitute(str, substr, "#"), ""), "#" );
if (length(substr) > 1, pos += (0::(length(substr)-1)*(nrow(pos)-1)::(length(substr)-1))`);
Re: JSL Challenge**************** Esto necesita un ajuste L: ver mi respuesta posterior *********************
Si puedes contar con algún personaje que NO aparezca en la cadena, podrías hacer algo como:
str = "abclkhsdfcdslkjscdlkjlkjcdkljcdcd";
loc(words(substitute(str, "cd", "#"), ""), "#" );
Re: JSL ChallengeCreo que podría ser capaz de diseñar una solución basada en este ejemplo del Índice de Scripting:
Names Default To Here( 1 );
source = "believe";
// [aeiou] matches exactly one vowel
// .*? is a reluctant (vs greedy) match. try it without the ? to see the greedy behavior
// \1 is a back reference to the first ( group -- [aeiou] is inside the first ( group
matches = Regex Match(
source, // a variable allows updating some text
"([aeiou])(.*?)(\1)", // a regex with parens makes back references
">\2<" // the match is replaced by text that uses a back reference
);
Show( source, matches );
// results:
// source = "b>li<VE></VE>