Référence arrière
\1\1\1\1\1
La fonction JSL REGEX Expression régulière a un argument de format qui est par défaut "\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 références arrière sont créées 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 : sur les paresseux
a ceci : terminé
et ça : 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 d’un mot de quatre lettres est plus compliqué ; il utilise \b pour faire correspondre les limites des mots. Sans le test des limites, rapide semble ê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 au texte entier. ( \!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"
L'expression régulière a introduit la casse irrégulière dans les majuscules initiales. La chaîne de format contient \U pour commencer la casse, \L pour commencer la casse et \E pour terminer le changement de casse.
grammaire pour les chaînes de remplacement regex (similaire à Perl)
- \L - commence à mettre la sortie en minuscule jusqu'à ce que \E
- \U - commence à mettre la sortie en majuscule jusqu'à ce que \E
- \E - fin du boîtier et modifications des cotations
- \l - (lettre minuscule L) - minuscule le caractère suivant
- \u - majuscule le caractère suivant
- \0 ... \999 - remplace 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
Bug trouvé : cela ne fonctionne pas actuellement, mais cela fonctionnera 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"
Utiliser \w+ plutôt que \w* évite également le problème en insistant sur le fait que les mots comportent 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 : Référence arrière@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 : Référence arrièremerci beaucoup pour votre aide,
je pense juste que le script fonctionne si j'utilise "Colnames" à la place de "ColsList" dans le FOR Cicle
Effacer les valeurs globales ();
Effacer le journal ();
dt = Tableau de données actuel ();
NomsCol = dt << Obtenir les noms de colonnes ( "Chaîne" );
Pour ( je = 1 , je <= N articles ( NomsCol ), i++,
Si ( ! Est manquant ( Expression régulière ( Carboniser ( NomsCol[i] ), "^[0-9]" ) ),
Col = Colonne ( dt, je ); // où dt est votre table de données
NomCol = Col << Obtenir le nom ;
NouveauNom = Concaténer ( "*" , NomCol );
Col << Définir le nom ( Nouveau nom );
)
);
je suis débutant dans les scripts jmp... pardonnez-moi si je me trompe
Re : Référence arrièreVous devrez peut-être changer l'expression régulière 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 : Référence arrière@gianpaolo ,
Voici une façon de répondre. 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 créée pour exécuter l'exemple
Re : Référence arrièreBonjour Craige_Hales,
j'ai trouvé la fonction 'regex' très intéressante pour appliquer mes travaux.
J'ai besoin de modifier en détail mon nom Comuns pour mon script. Je souhaite insérer un caractère lorsque le nom de ma colonne commence par un chiffre.
Par exemple, si : "00001 DATA no 1"
alors sera : "*00001 DATA no 1" (dans ce cas j'ai ajouté ' * ')
si c'est : "DONNÉES N° 1"
alors sera : "DATA no 1" (dans ce cas aucun changement)
est-il possible d'utiliser des regex ? pouvez-vous m'aider?
merci beaucoup
ciao Gianpaolo