
Un gruppo di funzioni per i caratteri di JMP è apparso in a messaggio precedente : lunghezza, substr, contiene, ecc. Sono fantastici per le cose semplici e per te Potevo fare cose difficili con loro se lo desideri. 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 vanilla "regex". È quello che vuoi, specialmente 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 searchPatterns sono simili alle espressioni regolari di Perl.
IL searchPattern è l'espressione regolare e descrive il testo da trovare. IL sostituireTemplate descrive come verrà sostituito il testo corrispondente e può utilizzare parti del testo corrispondente 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 set di caratteri. La scorciatoia con trattino specifica un intervallo. È possibile utilizzare [a-zA-Z] per creare un insieme di tutti i caratteri ASCII maiuscoli e minuscoli. L'asterisco (*) significa "ripeti lo schema 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] |
gli spazi bianchi includono tabulazione, ritorno, nuova riga, tabulazione verticale e avanzamento modulo |
| \S |
[^ \t\v\f] |
non spazi bianchi |
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 bianco. Oppure puoi aggiungere un file più
\D+
per abbinare una serie di uno o più caratteri non numerici. Oppure puoi aggiungere un file punto interrogativo
\w?
abbinare zero o uno caratteri delle parole.
Asterisco, più e punto interrogativo sono operatori di ripetizione e lo sono avido . Greedy 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 a ritroso e sostituireTemplate
Gran parte del potere in regex deriva dall'interazione tra il searchPattern e il sostituireTemplate . L'interazione viene creata mediante l'uso di riferimenti all'indietro, rappresentati come \0, \1, \2, ... Il valore predefinito di replaceTemplate è "\0". Il riferimento a ritroso \0 è l'intero testo che è stato abbinato. Le parentesi vengono utilizzate nelle espressioni regolari per raggruppare i bit di un modello insieme per formare modelli più grandi. Per esempio
regex( "cat dog catog cadog cat dog", "cat|dog", "***", GLOBALREPLACE)
"*** *** ***og ca*** *** ***"
regex( "cat dog catog cadog cat dog", "ca(t|d)og", "***", GLOBALREPLACE)
"gatto cane *** *** gatto cane"
La barra verticale separa le alternative e ha una precedenza molto bassa; il secondo esempio usa le parentesi per raggruppare t o d insieme. IL sostituireTemplate è solo testo costante, ***. Ma ogni parentesi aperta inizia un nuovo riferimento a ritroso e i riferimenti a ritroso possono essere utilizzati nel modello:
regex( "cat dog catog cadog cat dog", "ca(t|d)og", " \1 ", GLOBALREPLACE)
"cane gatto t d gatto cane"
GLOBALREPLACE fa in modo che la regex trovi e sostituisca tutte le corrispondenze; il modello corrisponde a catog o cadog. Il riferimento all'indietro è t o d, perché quella è la parte del modello all'interno delle parentesi. Il modello aggiunge alcuni spazi attorno al valore \1 e il modello viene quindi sostituito per ogni catog o cadog corrispondente.
È possibile utilizzare più coppie di parentesi, sia nidificate che in sequenza. Basta contare le parentesi aperte per trovare il numero di riferimento posteriore.
Formula della tabella dati
Ecco l'esempio di cognome, nome usando regex.
Column formula using regex()Column formula using regex()Column formula using regex()Column formula using regex() Formula di colonna usando regex()
Questo esempio usa gli ancoraggi ^ e $ (sottolineati in verde). ^ corrisponde all'inizio della stringa e $ corrisponde alla fine della stringa. \w* corrisponde a zero o più caratteri alfanumerici.Questo esempio potrebbe essere troppo semplice; non gestirà nomi con caratteri speciali o spazi vuoti. Puoi rielaborarlo per dividerlo su virgole usando i riferimenti a ritroso: 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 può avere spazi iniziali che \1 non ha perché \s* è fuori dalle 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 ti stai chiedendo come possono essere usati i riferimenti indietro.
Successivo: funzioni di pattern matching.
Aggiornamento 29 gennaio 2017: formattazione riparata per la nuova community.