Continúe preguntando sobre la segmentación RegexCometí un error. Escribir un código como este no te da el resultado correcto.
c=Regex("abcdef{:[[ghi]]:[{op},{q}]}", ":\[\[]\([^\]]*)\]", "[\1]");Necesito obtener:
[{op},{q}]Entonces, cómo escribir JSL. ¡Muchos gracias!
Re: Seguir preguntando sobre la segmentación RegexSi los datos son json o xml, debe usar el analizador json/xml de JMP. No es fácil escribir un analizador para estas estructuras anidadas, y la expresión regular por sí sola no es suficiente. Importar el xml/json a una tabla y luego encontrar la fila y la columna es una excelente opción.
Si los datos deben manejarse de alguna otra manera, puede hacerlo con solo un bucle JSL simple y un montón de pruebas de expresiones regulares, algo como esto:
txt = loadtextfile(...);
ok=1;
while( ok,
... try various regex that remove a bit of data from txt ... set ok to 0 if nothing works.
)
Eso funciona para archivos pequeños y se puede mantener fácilmente. Pero un archivo grande con muchos bits de datos será demasiado lento porque eliminar un poco de datos de una cadena de texto grande copia una gran cantidad de datos, para cada eliminación. (es un problema de n^2: duplicar el tamaño del archivo multiplicará por 4 el tiempo de ejecución).
Para archivos grandes, es mejor escribir una única coincidencia de patrón que no modifique la cadena de entrada. Puede usar expresiones regulares o patrones dentro de un patrón patRepeat() que coincida con todo el archivo, y usará patTest(... ;1) para ejecutar algo de JSL dentro de la coincidencia que guarda los resultados analizados en una matriz o lista JSL o matriz asociativa. Antes de que JMP tuviera un analizador json incorporado, @xangregg y escribí algunos JSL para analizar archivos json . Sigue siendo un gran ejemplo, pero el analizador integrado de JMP es mejor.
Aquí hay algunas otras publicaciones que tienen JSL que analiza un archivo usando patMatch(... patRepeat( patrón ) ... ) .
https://community.jmp.com/t5/Uncharted/El-otro-tipo-de-modelo/ba-p/231703 analizar un archivo de datos para un modelo 3D
https://community.jmp.com/t5/Uncharted/Web-Logs/ba-p/29389 analizar un archivo de registro de Apache
https://community.jmp.com/t5/Uncharted/WordNet/ba-p/28984 analizando el archivo wordnet
https://community.jmp.com/t5/Uncharted/Pronounce-Elephant/ba-p/21272 analizando el archivo de fonemas CMU
A menudo uso la función >>log() para depurar coincidencias de patrones complicados.
https://community.jmp.com/t5/Uncharted/Backtracking-Secrets/ba-p/20984 utilizando el >>registro() para depurar
y
https://community.jmp.com/t5/Uncharted/Pattern-Matching/ba-p/21005 introducción a patMatch()
https://community.jmp.com/t5/Uncharted/Regex/ba-p/21008 introducción a expresión regular ()
Re: Seguir preguntando sobre la segmentación RegexPorque necesito recorrer algo como esto.
Todavía quiero aprender a usar la regularización para eliminar el exceso de datos y retener datos útiles para el procesamiento continuo con JSL. ¡Muchas gracias!
Re: Seguir preguntando sobre la segmentación Regex¡Gracias por la ayuda de los expertos!
Descargué JMP15 y aprendí cómo hacerlo.
Comparé diferentes formas de obtener los datos. Entiendo la diferencia entre ellas.

Re: Seguir preguntando sobre la segmentación RegexJMP 15 hace un trabajo bastante bueno con estos datos JSON (cambie el nombre del archivo de .txt a .json, será más fácil @Justin_Chilton ); JMP 14 no parece manejar este caso json correctamente. Aquí está la importación de JMP 15 usando la mejor suposición y agregando la opción de pila:
Best Guess is under the red triangleBest Guess está debajo del triángulo rojo es posible que desee hacer dos importaciones como esta:
get the little table of column namesobtener la pequeña tabla de nombres de columna
get the bigger table of dataobtener la tabla de datos más grande
Puede omitir las columnas que no desee. Puede aplicar los nombres de columna de la tabla pequeña a la tabla grande, cambiando el nombre de value0 a 2018.
Re: Seguir preguntando sobre la segmentación Regexel otro codigo es
"\[[^\[]+(?=}$)"
Re: Seguir preguntando sobre la segmentación RegexObtuve dos códigos ortogonales en la comunidad de VBA, pero aún así no los cambiaré a código JSL.
Solicite orientación experta. ¡Gracias!
Sub t()
Set reg = CreateObject("vbscript.regexp")
reg.Pattern = "^(?:.*?(\[.*?]))*|."
reg.Global = True
Cells(1, 2) = reg.Replace(Cells(1, 1).Value, "$1")
End Sub
Re: Seguir preguntando sobre la segmentación RegexNo sé lo suficiente.
Pensé que era solo partición
Empezar con :[{
y terminar con el segundo}]
por lo que puede obtener [{...}] y entre ellos.
Parece que mi entendimiento original fue demasiado apresurado.
¡Gracias!
Re: Seguir preguntando sobre la segmentación RegexOtra idea es diseñar y escribir un analizador para una estructura de datos anidados (¿lista?) para transmitir el texto, construir los datos y luego recopilar los valores deseados.
Re: Seguir preguntando sobre la segmentación RegexEl texto real es mucho más complejo que el ejemplo que planteó y resolvimos.
Usted publicó este problema antes. Luego intenté convertir primero el texto en una lista JMP y luego iterar sobre los elementos, en lugar de intentar trabajar con todo el texto. JMP luchó conmigo todo el camino y nada de lo que probé funcionó. Tal vez alguien más sepa cómo obtener una lista. Parece tan simple. Creo que procesar las cadenas con Regex() sería mucho más sencillo con el texto dividido en elementos de la lista.
Re: Seguir preguntando sobre la segmentación RegexEl código anterior para los datos reales todavía no está a la altura.
No creo haber encontrado la llave.

Invite a los expertos a continuar con la orientación. ¡Gracias!
Re: Seguir preguntando sobre la segmentación RegexOtra forma:
Names Default to Here( 1 );
string = "abcdef{:[[ghi]]:[{op},{q}]}";
c = Regex( string, "\{:.+:(.+)\}", "\1" );Re: Seguir preguntando sobre la segmentación RegexAquí hay una alternativa potencial:
c = Regex( "abcdef{:[[ghi]]:[{op},{q}]}", "\!\[(\{\w+\},*)+]" );Re: Seguir preguntando sobre la segmentación RegexAsí es como lo haría:
Names Default To Here( 1 );
x = "abcdef{:[[ghi]]:[{op},{q}]}";
c=word(1,word(3,x,":"),"]") || "]";Re: Seguir preguntando sobre la segmentación RegexTampoco funciona:
c=Regex("abcdef{:[[ghi]]:[{op},{q}]}", ":\[\[]{([^\]]*)\]", "[{\1]");