JSL ChallengeJ'essaie de trouver un moyen simple et élégant de rechercher dans une chaîne de texte toutes les occurrences d'un modèle donné et d'obtenir leurs positions sans utiliser de boucle. Munger me dira combien il y en a, mais pas où ils se trouvent. Je peux penser à quelques solutions, mais je sens que je manque quelque chose.
Re: JSL ChallengeOn dirait une idée de livre de cuisine.
https://community.jmp.com/t5/JSL-Cookbook/Search-a-string-for-all-occurrences-of-a-pattern/ta-p/79761
Re: JSL ChallengeAh ok. Je me demandais juste. Des gens m'ont posé une question similaire mais en termes d'acides aminés ou de bases dans une colonne et j'ai mentionné que BLAST et d'autres outils de ce type sont un meilleur endroit pour ce type de question. Quelques personnes ont recherché des chaînes spécifiques dans une colonne de texte (comme des commentaires, par exemple). Mais l'explorateur de texte comblerait maintenant cette lacune pour ce type de questions (en utilisant des mots vides, etc.)Re: JSL ChallengeHonnêtement, c’est une question générale à laquelle j’ai pensé à faire quelque chose de similaire. Je sais que j'ai déjà rencontré le problème par le passé, mais je me souviens du contexte. De même, j'aimerais pouvoir lister les chaînes de texte identifiant les éléments contenant une chaîne cible (sans avoir à utiliser une boucle).
Re: JSL ChallengeSalut don,
Pour quel problème cherchez-vous à résoudre ce défi JSL? J'espère que ce ne sera pas une génomique. Il existe un outil appelé BLAST que les gens utilisent pour la recherche de séquence et qui fait quelque chose de similaire avec une logique floue incluse ainsi qu'un mécanisme de scoring.
Si juste pour l'exploration de texte, je ne suis pas tout à fait sûr à ce sujet. Je suppose que cela revient à utiliser une commande de recherche dans Word, TextPad, PDF Viewer ou un navigateur Web qui recherche une chaîne dans un corpus de texte et vous indique l'emplacement de ce qu'il a trouvé. SI oui, pourquoi ne pas utiliser ces outils au lieu de réinventer la roue avec JSL? ou en utilisant l'explorateur de texte et le forcer à chercher ce que vous voulez?
J'essaie juste de comprendre le contexte.
Chris
Re: JSL Challenge
Je viens de me rendre compte que cela ne fonctionnera pas tant que vous n'aurez pas ajusté les positions en fonction du fait que vous avez changé une chaîne de longueur k en une chaîne de 1 longueur. Donc, si la sous-chaîne était supérieure à 1 caractère, les positions doivent être ajustées. D'où la dernière clause "if".
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***************** Cela nécessite un ajustementL: voir ma réponse ultérieure *********************
Si vous pouvez compter sur un caractère n'apparaissant pas dans la chaîne, vous pouvez faire quelque chose comme:
str = "abclkhsdfcdslkjscdlkjlkjcdkljcdcd";
loc(words(substitute(str, "cd", "#"), ""), "#" );
Re: JSL ChallengeJe pense que vous pourriez être en mesure de concevoir une solution basée sur cet exemple à partir de l'index de script:
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>