Référence arrière
\1\1
La fonction JSL REGEX Regex a un argument de format qui par défaut est "\0". \0 est la référence arrière à tout le texte correspondant.
sentence = "the quick brown fox jumped over the lazy dog";
regex( sentence, "\w{6,6}", "\0"); // look for exactly 6 word characters
"sauté"
Les autres renvois sont créés par des parenthèses.
sentence = "the quick brown fox jumped over the lazy dog";
regex( sentence, "(\b\w{4,4}\b).*(\b\w{4,4}\b)",
"this part: \0\!nhas this: \1\!nand this: \2\!nfour letter words");
"cette partie : plus de paresseux
a ceci: plus
et ceci: paresseux
mots de quatre lettres"
Le premier exemple de six lettres a fonctionné car il n'y avait pas de mots de plus de six lettres. L'exemple de mot de quatre lettres est plus compliqué ; il utilise \b pour faire correspondre les limites des mots. Sans le test limite, rapide semblerait être un mot de quatre lettres. L'argument format a produit les quatre lignes de texte en utilisant les références arrière \0, \1 et \2. \1 est le premier groupe entre parenthèses et \2 le second. \0 correspond toujours à l'intégralité du texte. ( \!n est un caractère de nouvelle ligne. Tout est exécuté ensemble car tous les espaces font partie de la sortie. )
Regex est sensible à la casse par défaut. Cet exemple ne correspond pas et renvoie une valeur manquante
sentence = "the quick brown fox jumped over the lazy dog";
regex( sentence, "DOG");
.
Il existe une option pour cela.
sentence = "the quick brown fox jumped over the lazy dog";
regex( sentence, "DOG", "\0", IGNORECASE);
"chien"
Et il existe des spécifications pour changer la casse dans la chaîne de format.
sentence = "tHe QUick BROWN fox jUMPED over the lAZy DoG";
regex( sentence, "\b(\w)(\w*)\b", "\U\1\E\L\2\E", IGNORECASE, GLOBALREPLACE);
"Le rapide renard brun sauta par dessus le chien paresseux"
La regex a fait entrer le cas irrégulier dans les majuscules initiales. La chaîne de format contient \U pour commencer les majuscules, \L pour commencer les minuscules et \E pour terminer le changement de casse.
grammaire pour les chaînes de remplacement de regex (similaire à Perl)
- \L - commence la sortie en minuscules jusqu'à \E
- \U - commence à mettre en majuscule la sortie jusqu'à \E
- \E - fin de casse et modification des citations
- \l - (lettre minuscule L) - minuscule le caractère suivant
- \u - majuscule le caractère suivant
- \0 ... \999 - substitue l'une des expressions correspondantes du modèle
- \e - fin d'un nombre si plusieurs chiffres suivent : \7\e123 signifie l'expression 7 suivie de 123 (extension JMP)
- \\ - une seule barre oblique inverse
Trouvé un bogue : cela ne fonctionne pas actuellement, mais le sera dans la maintenance 12.2 (boucles à cause d'une mauvaise interaction avec IGNORECASE et GLOBALREPLACE et la correspondance de longueur nulle à la fin de la chaîne)
sentence = "tHe QUick BROWN fox jUMPED over the lAZy DoG";
regex( sentence, "\b(\w*)\b", "\L\u\1", IGNORECASE, GLOBALREPLACE);
Puisqu'il n'y a pas de caractères spécifiques à la casse dans la chaîne de recherche, cela fonctionnera :
sentence = "tHe QUick BROWN fox jUMPED over the lAZy DoG";
regex( sentence, "\b(\w*)\b", "\L\u\1", GLOBALREPLACE);
"Le rapide renard brun sauta par dessus le chien paresseux"
L'utilisation de \w+ plutôt que de \w* évite également le problème en insistant sur le fait que les mots ont au moins un caractère.
La valse du Tennessee est sur la face avant.
Mise à jour du 4 février 2017 : mise en forme (et image) réparée pour la nouvelle communauté.
Le troisième argument de regex est un puissant générateur de remplacement.
Re : Retour de référence@gianpaolo :
Votre observation est tout à fait correcte. C'était une faute de frappe et un oubli de ma part. Le script que vous avez posté est correct
Re : Retour de référencemerci beaucoup pour l'aide,
juste je pense que le script fonctionne si j'utilise "Colnames" au lieu de "ColsList" dans le FOR Cicle
Effacer les variables globales ();
Effacer le journal ();
dt = Tableau de données actuel ();
NomCol = dt << Obtenir les noms de colonne ( "Chaîne" );
Pour ( je = 1 , je <= N articles (ColNames), i++,
Si (! Est manquant ( Regex ( Carboniser ( NomCol[i] ), "^[0-9]" ) ),
col = Colonne ( dt, je ); // où dt est votre table de données
NomCol = Col << Obtenir le nom ;
NouveauNom = Concat ( "*" , NomCol );
Col << Définir le nom ( Nouveau nom );
)
);
je suis débutant dans les scripts jmp ... pardonnez-moi si je me trompe
Re : Retour de référenceVous devrez peut-être changer la regex en
<SPAN class="token string">"^[0-9]"</SPAN>
pour le forcer à trouver le caractère au début de la chaîne. Sinon, un nom comme Column7 correspondrait.
Re : Retour de référence@gianpaolo ,
Voici une façon d'aborder .Ma suggestion est de publier ces questions dans "Discussions" - et de fournir un lien vers le blog. La communauté pourra répondre plus rapidement à votre question :
Clear Globals(); Clear Log();
dt = Current Data Table();
ColNames = dt << Get Column Names("String");
for( i = 1 , i <= N Items(ColsList) , i++,
If(!IsMissing(Regex(Char(ColsList[i]),"[0-9]")),
Col = Column(dt,i); // where dt is your data table
ColName = Col << Get Name;
NewName = Concat("*",ColName);
Col << Set Name(NewName);
);
);
Fourni est une capture d'écran de la table de données (dt) que j'ai faite pour exécuter l'exemple
Re : Retour de référenceBonjour Craige_Hales,
j'ai trouvé la fonction 'regex' très intéressante pour appliquer mes travaux.
J'ai besoin de modifier mon nom Comuns pour mon script en détail, je voudrais insérer un caractère lorsque le nom de ma colonne commence par un nombre.
par exemple si est : "00001 DATA no 1"
alors sera : "*00001 DATA no 1" (dans ce cas j'ai ajouté ' * ')
si c'est : "DONNÉES n° 1"
sera alors : "DATA no 1" (dans ce cas pas de changement)
est-il possible d'utiliser regex? pouvez-vous m'aider?
merci beaucoup
ciao Gianpaolo