A pattern cut with a laserA pattern cut with a laserA pattern cut with a laserA pattern cut with a laserUn motif découpé au laser
Les fonctions de correspondance de modèles de JMP peuvent faire presque tout ce que regex peut faire et un un petit peu plus . En interne, regex est construit à partir des fonctions de correspondance de modèles et arbore une interface facile à utiliser. Vous n'aurez probablement jamais besoin de un petit peu plus , donc si vous avez de l'expérience avec les regex, ce pourrait être un bon endroit où séjourner. Ou, vous pourriez trouver le langage de correspondance de modèle plus attrayant. Ces expressions régulières peuvent être assez opaques.
La correspondance de modèle la plus simple pourrait ressembler à ceci :
source = "the old fox had eggs for breakfast";
ok = patMatch( source, "eggs" ); // ok will be 1 because the pattern "eggs" is found
1
Changer les œufs en bacon :
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"
Et découvrir ce que mange le renard:
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"
Si vous n'avez jamais vu les modèles auparavant, vous pourriez être déconcerté par l'affectation étrange à nourriture . Ces barres verticales simples signifient "ou". Ce ne sont pas des doubles barres verticales pour concaténer des chaînes. nourriture est une valeur de modèle qui correspondra à l'un de ces quatre mots. Il existe également un opérateur + pour concaténer des motifs (ce qui n'est pas la même chose que concaténer des chaînes). Renforçons cet exemple :
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";
Trois correspondances distinctes pour trouver un aliment suivi d'une heure de la journée (en utilisant le + pour concaténer les motifs). Vous pouvez également créer des modèles plus compliqués en quelques étapes simples :
d'abord, un petit modèle pour correspondre à une plage de chiffres
digits = patSpan("0123456789");
puis un modèle qui utilise le modèle de chiffres pour faire correspondre des nombres comme -314.15E-2 . Les alternatives "" ne permettent aucune correspondance, donc le signe, la décimale, la fraction et l'exposant sont facultatifs.
number = ( "" | "-" ) // optional sign
+ ( digits + ( "." + ( ( digits ) | "" ) | "" ) ) // leading digit not optional
+ ( ( ("E"|"e") + ( "" | "-" ) + digits ) | "" ) ; // another optional sign in the optional exponent
c'est pas un motif; les guillemets sont laids (ils doivent s'échapper) alors créez une variable
quote = "\!""; // nightmare -> thing of beauty
Vient ensuite un modèle pour faire correspondre le texte entre guillemets ; dans le fichier source texte (ci-dessous), les guillemets intégrés sont représentés par deux guillemets. Donc, ce modèle fonctionne un peu plus fort pour s'assurer que les paires de guillemets sont maintenues ensemble. patRepeat() répétera son argument autant de fois que possible. patBreak() correspondra à, mais sans inclure, son argument. patLen() est utilisé à la place de "" juste pour le montrer ; il correspond au nombre de caractères demandés. Ainsi, un littéral commence et se termine par un guillemet, et entre les deux, il y a des séries de caractères jusqu'à un guillemet. N'oubliez pas que patBreak n'inclut pas la citation... soit il y a deux citations et répétez-en d'autres, soit arrêtez de répéter et trouvez la citation finale.
literal = quote + patRepeat( patBreak(quote) + ( ( quote + quote ) | patLen(0) ) ) + quote;
ce petit modèle correspond à divers caractères de fin de ligne utilisés par différents systèmes d'exploitation
newline = "\!r\!n" | "\!r" | "\!n" | "\!N";
les champs de l'exemple d'entrée sont délimités par des virgules, ou le début du fichier, ou la fin du fichier, ou par une nouvelle ligne. patPos() et patRPos() correspond à une chaîne de longueur nulle si la position actuelle correspond à l'argument. patRPos(0) est l'extrémité droite de la chaîne. patPos(0) est le début de la chaîne.
endOfField = "," | newline | patPos(0) | patRPos(0);
voici l'exemple de texte à faire correspondre, en utilisant l'échappement spécial entre parenthèses pour que les guillemets n'aient pas besoin de s'échapper davantage.
sourcefile = "\[
-123.456e-78,"I said,""how are you?""",11,555-5555,"fine, thank you",3.1459,1.414
]\";
Enfin! une boucle while pour trouver le motif et le remplacer par une virgule, en imprimant le texte trouvé à chaque fois. À la fin, affichez le texte sans correspondance.
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,
Le > ? L'opérateur est l'affectation conditionnelle dans un modèle. L'affectation ne sera effectuée qu'après la réussite du modèle et que patMatch() renvoie 1. Il existe également un opérateur >> pour les affectations immédiates qui sont effectuées dès que le texte est mis en correspondance (éventuellement plusieurs fois si le comparateur de modèle doit sauvegarder et réessayer.)
Pattern Matching dans JSL peut faire d'autres choses intéressantes, comme boucle sur une longue chaîne dans une seule instruction , ce qui peut accélérer un processus autrement lent. Le PatRegex() La fonction vous permet d'utiliser une expression régulière dans le cadre d'une correspondance de modèle. L'index de script (à partir du menu Aide) contient une liste de fonctions et de descriptions de correspondance de modèles.
mise à jour 30jan2017 : réparer le formatage pour la nouvelle communauté.