A pattern cut with a laserA pattern cut with a laserA pattern cut with a laserA pattern cut with a laserEin mit einem Laser geschnittenes Muster
Die Mustervergleichsfunktionen von JMP können dies tun fast alles, was Regex kann und a ein bisschen mehr . Intern basiert Regex auf den Mustervergleichsfunktionen und verfügt über eine benutzerfreundliche Oberfläche. Du wirst das wahrscheinlich nie brauchen ein bisschen mehr Wenn Sie also Erfahrung mit Regex haben, ist dies möglicherweise ein guter Ort zum Übernachten. Oder Sie finden die Mustervergleichssprache möglicherweise attraktiver. Diese regulären Ausdrücke können ziemlich undurchsichtig sein.
Der einfachste Mustervergleich könnte so aussehen:
source = "the old fox had eggs for breakfast";
ok = patMatch( source, "eggs" ); // ok will be 1 because the pattern "eggs" is found
1
Eier durch Speck ersetzen:
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"
Und herausfinden, was der Fuchs frisst:
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"
Wenn Sie die Muster noch nicht gesehen haben, rätseln Sie vielleicht über die seltsam aussehende Zuordnung zu Lebensmittel . Diese einzelnen vertikalen Balken bedeuten „oder“. Es handelt sich nicht um doppelte vertikale Balken zum Verketten von Zeichenfolgen. Lebensmittel ist ein Musterwert, der mit jedem dieser vier Wörter übereinstimmt. Es gibt auch einen +-Operator zum Verketten von Mustern (was nicht dasselbe ist wie das Verketten von Zeichenfolgen). Lassen Sie uns dieses Beispiel aufpeppen:
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";
Drei separate Übereinstimmungen, um ein Lebensmittel gefolgt von einer Tageszeit zu finden (verwenden Sie das +, um die Muster zu verketten). Sie können in einfachen Schritten auch kompliziertere Muster erstellen:
Zuerst ein kleines Muster, um eine Reihe von Ziffern abzugleichen
digits = patSpan("0123456789");
dann ein Muster, das das Ziffernmuster verwendet, um Zahlen wie abzugleichen -314.15E-2 . Die „“-Alternativen erlauben keinen Abgleich, daher sind Vorzeichen, Dezimalzahl, Bruch und Exponent optional.
number = ( "" | "-" ) // optional sign
+ ( digits + ( "." + ( ( digits ) | "" ) | "" ) ) // leading digit not optional
+ ( ( ("E"|"e") + ( "" | "-" ) + digits ) | "" ) ; // another optional sign in the optional exponent
das ist nicht ein Muster; Anführungszeichen sind hässlich (sie müssen maskiert werden), also erstellen Sie eine Variable
quote = "\!""; // nightmare -> thing of beauty
Als nächstes folgt ein Muster zum Abgleichen von Text in Anführungszeichen. im Quelldatei Im Text (unten) werden eingebettete Anführungszeichen als zwei Anführungszeichen dargestellt. Daher ist dieses Muster etwas schwieriger, um sicherzustellen, dass Anführungszeichenpaare zusammengehalten werden. patRepeat() wird sein Argument so oft wie möglich wiederholen. patBreak() stimmt mit seinem Argument überein, schließt es jedoch nicht ein. patLen() wird anstelle von „“ verwendet, nur um es zur Schau zu stellen; es entspricht der Anzahl der angeforderten Zeichen. Ein Literal beginnt und endet also mit einem Anführungszeichen und hat dazwischen Zeichenreihen bis hin zu einem Anführungszeichen. Denken Sie daran, dass patBreak das Zitat nicht enthält ... also gibt es entweder zwei Anführungszeichen und wiederholen Sie einige weitere, oder hören Sie auf zu wiederholen und suchen Sie das letzte Zitat.
literal = quote + patRepeat( patBreak(quote) + ( ( quote + quote ) | patLen(0) ) ) + quote;
Dieses kleine Muster entspricht verschiedenen Zeilenendezeichen, die von verschiedenen Betriebssystemen verwendet werden
newline = "\!r\!n" | "\!r" | "\!n" | "\!N";
Felder in der Beispieleingabe werden durch Kommas, den Anfang der Datei, das Ende der Datei oder einen Zeilenumbruch getrennt. patPos() Und patRPos() Übereinstimmung mit einer Zeichenfolge der Länge Null, wenn die aktuelle Position mit dem Argument übereinstimmt. patRPos(0) ist das rechte Ende der Zeichenfolge. patPos(0) ist der Anfang der Zeichenfolge.
endOfField = "," | newline | patPos(0) | patRPos(0);
Hier ist der Beispieltext zum Abgleichen, wobei das spezielle Klammer-Escapezeichen verwendet wird, damit die Anführungszeichen kein weiteres Escapezeichen benötigen.
sourcefile = "\[
-123.456e-78,"I said,""how are you?""",11,555-5555,"fine, thank you",3.1459,1.414
]\";
Endlich! eine While-Schleife, um das Muster zu finden und durch ein Komma zu ersetzen, wobei jedes Mal der gefundene Text ausgegeben wird. Zeigen Sie am Ende den nicht übereinstimmenden Text an.
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,
Das >? Operator ist die bedingte Zuweisung innerhalb eines Musters. Die Zuweisung erfolgt erst, nachdem das Muster erfolgreich war und patMatch() 1 zurückgibt. Es gibt auch einen >>-Operator für sofortige Zuweisungen, die vorgenommen werden, sobald Text abgeglichen wird (möglicherweise mehrmals, wenn der Mustervergleicher eine Sicherungskopie erstellen und es erneut versuchen muss).
Pattern Matching in JSL kann andere interessante Dinge tun, wie z Durchlaufen einer langen Zeichenfolge in einer einzelnen Anweisung , was einen ansonsten langsamen Prozess beschleunigen könnte. Der PatRegex() Mit der Funktion können Sie einen regulären Ausdruck als Teil eines Mustervergleichs verwenden. Der Skriptindex (im Hilfemenü) enthält eine Liste von Mustervergleichsfunktionen und Beschreibungen.
Update 30. Januar 2017: Formatierung für neue Community reparieren.