A pattern cut with a laserA pattern cut with a laserA pattern cut with a laserA pattern cut with a laserUn modello tagliato con un laser
Le funzioni di pattern matching di JMP possono fare Quasi tutto ciò che regex può fare e a un po 'di più . Internamente, regex è costruito dalle funzioni di corrispondenza dei modelli e sfoggia un'interfaccia facile da usare. Probabilmente non avrai mai bisogno del un po 'di più , quindi se hai esperienza con regex, potrebbe essere un buon posto dove stare. Oppure potresti trovare il linguaggio di corrispondenza del modello più attraente. Quelle espressioni regolari possono essere piuttosto opache.
La corrispondenza del modello più semplice potrebbe essere simile a questa:
source = "the old fox had eggs for breakfast";
ok = patMatch( source, "eggs" ); // ok will be 1 because the pattern "eggs" is found
1
Cambiare le uova in pancetta:
source = "the old fox had eggs for breakfast";
ok = patMatch( source, "eggs", "bacon" ); // 3rd argument is the replacement text
print(source);
"the old fox had bacon for breakfast"
E scoprire cosa mangia la volpe:
morningMeal = .;
source = "the old fox had yogurt for breakfast";
foods = "eggs" | "bacon" | "yogurt" | "honey";
ok = patMatch( source, foods >? morningMeal ); // >? is an assign-to-the-right operator for patterns
print(morningMeal );
"yogurt"
Se non hai mai visto gli schemi prima, potresti essere perplesso sull'assegnazione dall'aspetto strano a Alimenti . Quelle singole barre verticali significano "o". Non sono doppie barre verticali per concatenare le stringhe. Alimenti è un valore di modello che corrisponderà a una qualsiasi di queste quattro parole. C'è anche un operatore + per concatenare modelli (che non è la stessa cosa di concatenare stringhe). Rafforziamo questo esempio:
source = "the old fox had yogurt for breakfast, honey for dinner, and bacon for lunch, but eggs at bedtime.";
foods = "eggs" | "bacon" | "yogurt" | "honey";
morningMeal=.;
middayMeal=.;
eveningMeal=.;
ok1 = patMatch( source, ( foods >? morningMeal + " for breakfast" ) );
ok2 = patMatch( source, ( foods >? middayMeal + " for lunch" ) );
ok3 = patMatch( source, ( foods >? eveningMeal + " for dinner" ) );
show(morningMeal, middayMeal, eveningMeal);
morningMeal = "yogurt";
middayMeal = "bacon";
eveningMeal = "honey";
Tre corrispondenze separate per trovare un alimento seguito da un'ora del giorno (usando il + per concatenare gli schemi). Puoi anche creare modelli più complicati in semplici passaggi:
in primo luogo, un piccolo schema per abbinare un intervallo di cifre
digits = patSpan("0123456789");
quindi un modello che utilizza il modello di cifre per abbinare i numeri come -314.15E-2 . Le alternative "" non consentono di abbinare nulla, quindi il segno, il decimale, la frazione e l'esponente sono facoltativi.
number = ( "" | "-" ) // optional sign
+ ( digits + ( "." + ( ( digits ) | "" ) | "" ) ) // leading digit not optional
+ ( ( ("E"|"e") + ( "" | "-" ) + digits ) | "" ) ; // another optional sign in the optional exponent
questo è non uno schema; le virgolette sono brutte (devono sfuggire) quindi crea una variabile
quote = "\!""; // nightmare -> thing of beauty
Il prossimo è un modello per abbinare il testo tra virgolette; nel file sorgente testo (sotto), le virgolette incorporate sono rappresentate come due virgolette. Quindi questo modello lavora un po' più duramente per assicurarsi che le coppie di virgolette siano tenute insieme. patRepeat() ripeterà il suo argomento quante più volte possibile. patBreak() corrisponderà al suo argomento, ma non lo includerà. patLen() è usato al posto di "" solo per metterlo in mostra; corrisponde al numero di caratteri richiesti. Quindi, un letterale inizia e finisce con una citazione, e in mezzo ha sequenze di caratteri fino a una citazione. Ricorda che patBreak non include la citazione...quindi o ci sono due virgolette e ripetine altre, oppure smetti di ripetere e trova la citazione finale.
literal = quote + patRepeat( patBreak(quote) + ( ( quote + quote ) | patLen(0) ) ) + quote;
questo piccolo modello corrisponde a vari caratteri di fine riga utilizzati da diversi sistemi operativi
newline = "\!r\!n" | "\!r" | "\!n" | "\!N";
i campi nell'input di esempio sono delimitati da virgole o dall'inizio del file o dalla fine del file o da una nuova riga. patPos() E patRPos() corrisponde a una stringa di lunghezza zero se la posizione corrente corrisponde all'argomento. patRPos(0) è l'estremità destra della stringa. patPos(0) è l'inizio della stringa.
endOfField = "," | newline | patPos(0) | patRPos(0);
ecco il testo di esempio da abbinare, usando la speciale parentesi escape in modo che le virgolette non abbiano bisogno di più caratteri di escape.
sourcefile = "\[
-123.456e-78,"I said,""how are you?""",11,555-5555,"fine, thank you",3.1459,1.414
]\";
Finalmente! un ciclo while per trovare lo schema e sostituirlo con una virgola, stampando ogni volta il testo trovato. Alla fine, visualizza il testo senza corrispondenza.
while(patMatch(sourcefile, endOfField + (number | literal ) >? found + endOfField , ","),
write(found || "\!n") // display the found text and a newline
);
write( "Non matches: ", sourceFile, "\!n");
-123.456e-78
"I said,""how are you?"""
11
"fine, thank you"
3.1459
1.414
Non matches: ,555-5555,
Il >? operatore è l'assegnazione condizionale all'interno di un modello. L'assegnazione verrà effettuata solo dopo che il modello ha esito positivo e patMatch() restituisce 1. C'è anche un operatore >> per le assegnazioni immediate che vengono effettuate non appena il testo viene abbinato (probabilmente molte volte se il pattern matcher deve eseguire il backup e riprovare).
Pattern Matching in JSL può fare altre cose interessanti, come eseguire il ciclo su una lunga stringa in una singola istruzione , che potrebbe accelerare un processo altrimenti lento. IL PatRegex() La funzione consente di utilizzare un'espressione regolare come parte di una corrispondenza di modello. L'indice di scripting (dal menu Help) ha un elenco di funzioni e descrizioni di pattern matching.
aggiornamento 30 gennaio 2017: riparazione della formattazione per la nuova community.