Limites des mots JSL REGEX \ b<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Bonjour, -
JSL prend-il en charge les limites de mots REGEX? \ b?
J'essaie de remplacer des mots complets dans le texte en utilisant PAT MATCH et l'expression "\ bword \ b". Pour une raison quelconque, JSL ne traite pas \ b, bien qu'il reconnaisse et traite \ W. Malheureusement, \ W n’est pas suffisant pour ma tâche car il ne fait pas correspondre les entrées à un mot parmi les autres problèmes qu’il introduit.
Exemple:
a = "la fenêtre est: ouverte";
p = pat regex ("\ bis \ b");
pat match (a, p, "était");
Je m'attendrais à ce qu'il revienne: a = "window was: open";
Merci! - Shaul
Re: limites de mots JSL REGEX \ bAh, très bien. Bien mieux, merci. JMP10 a une fonction regex simplifiée qui remplace globalement:
regex ("bonjour", "[^ aeiou]", "?", GLOBALREPLACE);
"? e ?? o"
RegexMatch () nécessite une boucle externe (le while () de l'exemple précédent). PatMatch () peut utiliser une expression régulière dans le cadre d'un motif, mais n'utilise pas les références arrière, sauf dans patRegex (); patMatch est destiné à construire un motif en utilisant les fonctions patXXXX plutôt que le langage regex et propose différentes manières de capturer des correspondances partielles.
Re: limites de mots JSL REGEX \ bJ'ai simplifié la regex en utilisant \ W (JMP9 accepté \ W):
x = "le grand renard très rapide";
a = correspondance de regex (x, "(\ W | ^) (très) (\ W | $)", "\ 1bien \ 3");
imprimer (x);
Mon seul problème restant est que le remplacement n’est effectué qu’une seule fois; il me faut donc une boucle jusqu’à ce qu’aucune correspondance ne soit renvoyée. Existe-t-il un indicateur, tel que FULLSCAN, que je pourrais spécifier dans Regex Match? Je ne pouvais pas faire fonctionner Pat Match pour une raison quelconque.
En tout cas, tu m'as déjà beaucoup aidé!
Re: limites de mots JSL REGEX \ bLes expressions entre parenthèses dans l'expression rationnelle forment un groupe de capture auquel on peut faire référence par un numéro; Comptez seulement les parenthèses ouvertes, de gauche à droite, pour obtenir le nombre. Le texte mis en correspondance par le groupe de capture peut être utilisé comme référence arrière ultérieurement dans l'expression régulière ou dans la chaîne de remplacement. \ 1 est une référence arrière au premier groupe de capture.
regexMatch (x, "([^ a-zA-Z0-9_] | ^) ([a-zA-Z0-9 _] {4}) ([^ a-zA-Z0-9_] | $)", " \ 1fairly \ 3 ");
a 3 parens ouverts; le jeu moyen (autour du mot correspondant) n'était pas vraiment nécessaire, mais comme ils sont là, j'utilise \ 1 et \ 3 dans la chaîne de remplacement. \ 0 fait référence au match entier. Si vous imbriquez les groupes de parenthèses, vous ne comptez que les parenthèses ouverts, de gauche à droite, pour obtenir le nombre.
J'ai utilisé des répétitions {4} pour créer un exemple qui ne trouve pas les mots de trois et cinq lettres dans le texte source qui est venu en premier. Vous aurez peut-être besoin d'un autre moyen pour spécifier le mot. Voici un exemple qui déchire les mots un à un:
Imprimer (version JMP ());
x = "le grand renard très rapide";
Alors que (1,
results = Regex Match (x, "([^ a-zA-Z0-9_] | ^) ([a-zA-Z0-9 _] +) ([^ a-zA-Z0-9_] | $)", "\ 1 \ 3");
Si (N Articles (résultats)> = 3,
Imprimer (résultats [3]),
Pause()
)
)
"9.0.2"
"la"
"grand"
"très"
"rapide"
"Renard"
Dans cet exemple, le + signifie "une ou plusieurs des expressions précédentes", vous n'avez donc peut-être pas besoin de la longueur explicite. RegexMatch renvoie une liste de références arrière. Le premier élément de la liste est \ 0, ce qui représente la correspondance complète. Le résultat [3] est \ 2, qui correspond au mot correspondant. Le remplacement est \ 1 \ 3, ce qui supprime \ 2 de la chaîne.
Un certain nombre de sites Web proposent des didacticiels pour regex. Regular-Expressions.info - Didacticiel Regex, exemples et références - Modèles Regexp , par exemple.
\ B de JMP11 simplifiera beaucoup les exemples.
Re: limites de mots JSL REGEX \ bCeci est très utile car je suis toujours sur JMP9.
Je devrai ajuster dynamiquement le {n} en fonction de la longueur de chaîne à rechercher.
Pouvez-vous préciser comment fonctionne la numérotation des substitutions? Je ne suis pas sûr de comprendre ce que font \ 1 et \ 3?
Je vous remercie! - Shaul
Re: limites de mots JSL REGEX \ bJMP10 ne prend pas en charge la limite de mot \ b dans les expressions rationnelles. JMP11 le fera. Dans les exemples suivants, {4} signifie 4 occurrences du caractère précédent qui est destiné à correspondre au mot de 4 lettres "très" en exigeant la limite de mot de chaque côté. La fonction regexMatch interprète le deuxième argument comme une expression régulière et interprète le troisième argument comme un texte de remplacement avec des substitutions numérotées après les groupes de parenthèses capturés (utilisé dans le deuxième exemple).
print (JMPVERSION ());
x = "le grand renard très rapide";
regexMatch (x, "\ b \ w {4} \ b", "assez");
imprimer (x);
"11.0.0"
"le grand renard assez rapide"
Selon vos besoins, JMP10 peut le faire assez bien en capturant les caractères de délimitation et en les réinsérant dans le remplacement:
print (JMPVERSION ());
x = "le grand renard très rapide";
regexMatch (x, "([^ a-zA-Z0-9_] | ^) ([a-zA-Z0-9 _] {4}) ([^ a-zA-Z0-9_] | $)", " \ 1fairly \ 3 ");
imprimer (x);
"10.0.1"
"le grand renard assez rapide"
\ b est un motif difficile à impossible à écrire car il doit correspondre à la fois avant et après un mot, mais ne correspondre à aucun texte et le mot peut se trouver au tout début (^) ou à la fin ($) de le texte. Le deuxième exemple contourne l'exigence «ne correspondre à aucun texte» en utilisant les groupes de parenthèses \ 1 et \ 3 dans le texte de remplacement.