A pattern cut with a laserA pattern cut with a laserA pattern cut with a laserA pattern cut with a laserUn patrón cortado con un láser.
Las funciones de coincidencia de patrones de JMP pueden hacer casi todo lo que regex puede hacer y un un poco más . Internamente, regex se construye a partir de las funciones de coincidencia de patrones y luce una interfaz fácil de usar. Probablemente nunca necesitarás el un poco más , por lo que si tiene experiencia con expresiones regulares, podría ser un buen lugar para quedarse. O bien, puede encontrar más atractivo el lenguaje de coincidencia de patrones. Esas expresiones regulares pueden ser bastante opacas.
La coincidencia de patrón más simple podría verse así:
source = "the old fox had eggs for breakfast";
ok = patMatch( source, "eggs" ); // ok will be 1 because the pattern "eggs" is found
1
Cambio de huevos a tocino:
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"
Y averiguando lo que come el zorro:
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 no ha visto los patrones antes, es posible que esté desconcertado por la tarea de aspecto extraño para alimentos . Esas barras verticales individuales significan "o". No son barras verticales dobles para concatenar cadenas. alimentos es un valor de patrón que coincidirá con cualquiera de esas cuatro palabras. También hay un operador + para concatenar patrones (que no es lo mismo que concatenar cadenas). Vamos a reforzar este ejemplo:
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";
Tres coincidencias separadas para encontrar un alimento seguido de una hora del día (usando el + para concatenar los patrones). También puede crear patrones más complicados en pasos sencillos:
primero, un pequeño patrón para que coincida con un lapso de dígitos
digits = patSpan("0123456789");
luego un patrón que usa el patrón de dígitos para hacer coincidir números como -314.15E-2 . Las alternativas "" no permiten hacer coincidir nada, por lo que el signo, el decimal, la fracción y el exponente son opcionales.
number = ( "" | "-" ) // optional sign
+ ( digits + ( "." + ( ( digits ) | "" ) | "" ) ) // leading digit not optional
+ ( ( ("E"|"e") + ( "" | "-" ) + digits ) | "" ) ; // another optional sign in the optional exponent
esto es no un patrón; las comillas son feas (deben escapar), así que haga una variable
quote = "\!""; // nightmare -> thing of beauty
El siguiente es un patrón para hacer coincidir el texto entre comillas; en el archivo fuente texto (abajo), las comillas incrustadas se representan como dos comillas. Entonces, este patrón funciona un poco más para asegurarse de que los pares de comillas se mantengan juntos. palmaditaRepetir() repetirá su argumento tantas veces como sea posible. patBreak() coincidirá hasta, pero sin incluir, su argumento. PatLen() se usa en lugar de "" solo para mostrarlo; coincide con el número de caracteres solicitados. Entonces, un literal comienza y termina con una comilla, y en el medio tiene series de caracteres hasta una comilla. Recuerde que patBreak no incluye la cita... así que hay dos citas y repite algunas más, o deja de repetir y encuentra la cita final.
literal = quote + patRepeat( patBreak(quote) + ( ( quote + quote ) | patLen(0) ) ) + quote;
este pequeño patrón coincide con varios caracteres de final de línea utilizados por diferentes sistemas operativos
newline = "\!r\!n" | "\!r" | "\!n" | "\!N";
los campos en la entrada de muestra están delimitados por comas, o el principio del archivo, o el final del archivo, o por una línea nueva. patPos() y patRPos() coincide con una cadena de longitud cero si la posición actual coincide con el argumento. patRPos(0) es el extremo derecho de la cadena. PatPos(0) es el comienzo de la cadena.
endOfField = "," | newline | patPos(0) | patRPos(0);
aquí está el texto de muestra para que coincida, usando el escape de corchete especial para que las comillas no necesiten más escapes.
sourcefile = "\[
-123.456e-78,"I said,""how are you?""",11,555-5555,"fine, thank you",3.1459,1.414
]\";
¡Finalmente! un ciclo while para encontrar el patrón y reemplazarlo con una coma, imprimiendo el texto encontrado cada vez. Al final, muestra el texto no coincidente.
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,
El >? operador es la asignación condicional dentro de un patrón. La asignación solo se realizará después de que el patrón tenga éxito y patMatch() devuelva 1. También hay un operador >> para asignaciones inmediatas que se realizan tan pronto como el texto coincide (posiblemente muchas veces si el comparador de patrones debe hacer una copia de seguridad y volver a intentarlo).
La coincidencia de patrones en JSL puede hacer otras cosas interesantes, como recorriendo una cadena larga en una sola declaración , lo que podría acelerar un proceso lento. El PatRegex() La función le permite usar una expresión regular como parte de una coincidencia de patrón. El índice de secuencias de comandos (del menú Ayuda) tiene una lista de funciones y descripciones de coincidencia de patrones.
actualización 30 de enero de 2017: reparación del formato para la nueva comunidad.