
Un gruppo di funzioni di carattere JMP è apparso in a messaggio precedente : lunghezza, substr, contiene, ecc. Sono ottimi per le cose semplici, e tu Potevo fai cose difficili con loro se vuoi. Ma Regex potrebbe essere migliore.
Regex, abbreviazione di Espressione regolare , è una potente funzione JSL per la manipolazione del testo.
result = regex( sourceText, searchPattern, replaceTemplate, options );
(Ci sono altre due funzioni in JSL con Regex nel loro nome; per ora basta guardare "regex" di vaniglia. È quello che vuoi, soprattutto se lo stai usando in una formula di colonna.)
Questa è un'introduzione molto incompleta alle espressioni regolari (ma una descrizione ragionevolmente completa della funzione regex di JMP). Puoi trovare molti tutorial per le espressioni regolari sul web; Espressione regolare di JMP searchPattern sono simili alle espressioni regolari di Perl.
Il searchPattern è l'espressione regolare e descrive il testo da trovare. Il sostituireModello descrive come verrà sostituito il testo corrispondente e può usare bit del testo abbinato nel modello. Gli esempi seguenti usano una stringa letterale (tra virgolette) per il primo argomento, per chiarezza, ma una variabile che contiene il sourceText avrebbe quasi sempre più senso.
regex( "123 456 789", "[0-9]*")
"123"
Questo esempio ha due argomenti, sourceText e searchPattern . Il searchPattern utilizza parentesi quadre per creare un insieme di caratteri. Il collegamento con il trattino specifica un intervallo. Puoi usare [a-zA-Z] per creare un insieme di tutti i caratteri ASCII maiuscoli e minuscoli. L'asterisco (*) significa "ripetere il modello precedente zero o più volte". \d è una scorciatoia per l'insieme di tutte le cifre.
regex( "123 456 789", "\d*")
"123"
Un set di caratteri come [0123456789] può essere negato iniziandolo con un cappello: [^0123456789] corrisponde a qualsiasi carattere che non sia una cifra. Alcune delle scorciatoie come \d possono essere rappresentate come un set di caratteri:
| \w |
[a-zA-Z0-9_] |
caratteri delle parole |
| \W |
[^a-zA-Z0-9_] |
non caratteri di parole |
| \d |
[0-9] |
cifre |
| \D |
[^0-9] |
non cifre |
| \S |
[ \t\v\f] |
lo spazio bianco include tabulazione, ritorno, nuova riga, tabulazione verticale e formfeed |
| \S |
[^ \t\v\f] |
non spazio bianco |
Tutte le scorciatoie sopra corrispondono a un singolo carattere . Puoi aggiungere il asterisco
\S*
per abbinare una serie di zero o più caratteri di spazio vuoto. Oppure puoi aggiungere un più
\D+
per abbinare una serie di uno o più caratteri non numerici. Oppure puoi aggiungere un punto interrogativo
\w?
da abbinare zero o uno caratteri delle parole.
Asterisco, più e punto interrogativo sono operatori di ripetizione e lo sono avido . Avidi significa che prendono più testo possibile, quindi si ritirano più tardi, se necessario. Possono essere resi riluttanti aggiungendo un punto interrogativo. Generalmente avido è il comportamento che desideri, ma non sempre.
Parentesi, riferimenti posteriori e sostituireModello
Gran parte del potere in regex deriva dall'interazione tra il searchPattern e il sostituireModello . L'interazione è creata dall'uso di riferimenti indietro, rappresentati come \0, \1, \2, ... Il valore predefinito di replaceTemplate è "\0". Il riferimento indietro \0 è l'intero testo che è stato confrontato. Le parentesi vengono utilizzate nelle espressioni regolari per raggruppare i bit di un modello per formare modelli più grandi. Per esempio
regex( "cat dog catog cadog cat dog", "cat|dog", "***", GLOBALREPLACE)
"*** *** *** e ca*** *** ***"
regex( "cat dog catog cadog cat dog", "ca(t|d)og", "***", GLOBALREPLACE)
"cane gatto *** *** cane gatto"
La barra verticale separa le alternative e ha una precedenza molto bassa; il secondo esempio usa le parentesi per raggruppare t o d. Il sostituireModello è solo un testo costante, ***. Ma ogni parentesi aperta inizia un nuovo riferimento indietro e i riferimenti indietro possono essere utilizzati nel modello:
regex( "cat dog catog cadog cat dog", "ca(t|d)og", " \1 ", GLOBALREPLACE)
"cane gatto t d cane gatto"
GLOBALREPLACE fa sì che la regex trovi e sostituisca tutte le corrispondenze; il modello corrisponde a catog o cadog. Il riferimento indietro è t o d, perché questa è la parte del motivo tra parentesi. Il modello aggiunge alcuni spazi intorno al valore \1 e il modello viene quindi sostituito per ogni catog o cadog abbinato.
È possibile utilizzare più coppie di parentesi, sia nidificate che in sequenza. Basta contare le parentesi aperte per trovare il numero di riferimento posteriore.
Formula tabella dati
Ecco l'esempio di cognome, nome usando regex.
Column formula using regex() Formula della colonna usando regex()
Questo esempio utilizza le ancore ^ e $ (sottolineate in verde). ^ corrisponde all'inizio della stringa e $ corrisponde alla fine della stringa. \w* corrisponde a zero o più caratteri di una parola.Questo esempio potrebbe essere troppo semplice; non gestirà nomi con caratteri speciali o spazi vuoti. Puoi rielaborarlo per dividerlo in virgole usando i riferimenti indietro: Regex(nome, "([^,]*)", "\1") e Regex(nome, "\s*([^,]*)$", "\1") forse."([^,]*)" significa zero o più caratteri che non sono virgole e "\s*([^,]*)$" significa saltare zero o più spazi, mantenere tutte le non virgole ed essere alla fine. Nel "([^,]*)" caso \1 e \0 sono gli stessi. Ma in "\s*([^,]*)$", \0 potrebbe avere spazi iniziali che \1 non ha perché \s* è al di fuori delle parentesi per \1.
C'è molto di più nelle espressioni regolari, ben descritte altrove sul web (cerca regex). E anche l'esempio di Alice e Jerry nell'indice di scripting è abbastanza buono, se stai cercando di capire come utilizzare i riferimenti posteriori.
Avanti: funzioni di corrispondenza dei modelli.
Aggiornamento 29 gennaio 2017: formattazione riparata per la nuova community.