4 votos

Regex no funciona adecuadamente con caracteres chinos en applescript

Estoy tratando de hacer un script que analice la carpeta actual en partes utilizables, siguiendo el patrón (\d\d\d\.\d+.\d+) - (.*)(\(.*)\) en python, que captura 3 grupos {fecha, nombre, persona} (la fecha está en el formato de mi país, así que no está en yyyymmdd)

Sin embargo, la expresión regular funciona mal cuando hay caracteres chinos en el nombre.

Por ejemplo:

111.1.1 - this_is_file_name(cookie) => {"111.1.1", "this_is_file_name", "cookie"}

111.1.1 - (cookie) => {"111.1.1", "", ""} # esto funciona de manera muy extraña

Este es el script que estoy ejecutando, podría ser un poco diferente ya que la sintaxis de Applescript es diferente a la versión de regex de python.

-- Extraer el nombre de archivo y la persona del nombre de la carpeta actual usando regex
establecer regexPattern a "(\\d+\\.\\d+\\.\\d+)\\s-\\s(.*)(\\(.*\\))?$"
establecer {fechaString, nombre, persona} a extractData(currentolderPath, regexPattern)

mostrar alerta fechaString # funciona como estaba previsto
mostrar alerta nombre # valor incorrecto
mostrar alerta persona # valor incorrecto

-- Extraer datos usando regex
en extractData(inputString, regexPattern)
    intentar
        establecer capturedData a {}
        establecer regexResults a hacer script de la terminal "echo " & quoted form of inputString & " | grep -oE '" & regexPattern & "'"
        establecer {rocDateString, nombreArchivo, persona} a palabras de regexResults
        establecer capturedData a {rocDateString, nombreArchivo, persona}
    en error
        establecer capturedData a {"", "", ""}
    fin intentar
    devolver capturedData
fin extractData

1voto

Mockman Puntos 16

Tres cosas...

Primero, evita usar name como una variable ya que ya tiene significado en varios lugares. Puedes ver que su color es diferente a las otras variables (en mi sistema es de color morado, como una propiedad, en lugar de verde como una variable. Intenta algo como fName en su lugar.

Segundo, la causa clave de tu problema es words.

Si ejecutas la siguiente línea en un script separado, verás el problema:

words of "111.1.1 - 檔案(cookie)"
--> {"111.1.1", "檔", "案", "cookie"}

Para el sistema, cada uno de los dos caracteres chinos se considera individualmente una palabra. Además, los () se consideran signos de puntuación y no forman parte de la palabra cookie. Debo notar que dependiendo de tu entorno de sistema (el mío está configurado en inglés de EE. UU.), podrías obtener un resultado diferente.

El resultado es que cuando solicitas las primeras tres palabras de la cadena, no obtienes cookie.

¿Tu cadena de entrada siempre tendrá la misma estructura?

por ejemplo 'cadena de fecha' ' - ' 'caracteres chinos' 'palabra entre paréntesis'

Actualizaciones:

Intenta esto. En lugar de usar grep y words (que pueden no aplicarse dependiendo de la cadena de entrada), uso sed y párrafos. El comando sed divide la cadena en párrafos basados en cada grupo capturado. Cada una de las tres variables puede asignarse entonces al grupo apropiado.

Actualización: Revisa el script para manejar adecuadamente tanto inputString como currentFolderPath, según comentarios/imagen

set inputString to quoted form of "113.1.29 - 一段文字(123)"
set currentFolderPath to "/Users/cookie/Desktop/113.10.10 - helloworld測試(test)"

set regexCmd to "sed -Ee 's@^.*\\/([[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]].*$)@\\1@' -e 's@([[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+)[[:blank:]]-[[:blank:]](.*)(\\(.*\\))@\\1\\
\\2\\
\\3@ ' "

-- filename, person
set {inputDateString, inputFileName, inputPerson} to extractData(inputString, regexCmd)
display alert "Fecha: " & inputDateString # funcionando como se espera
display alert "Nombre archivo: " & inputFileName # valor incorrecto
display alert "Persona: " & inputPerson # valor incorrecto

log "inputString: " & inputString & linefeed & "inputDateString: " & inputDateString & linefeed & "inputFileName: " & inputFileName & linefeed & "inputPerson: " & inputPerson & linefeed

-- ruta de carpeta
set currentFolderPath to quoted form of currentFolderPath
set {folderDateString, folderFileName, folderPerson} to extractData(currentFolderPath, regexCmd)

log "currentFolderPath: " & currentFolderPath & linefeed & "folderDateString: " & folderDateString & linefeed & "folderFileName: " & folderFileName & linefeed & "folderPerson: " & folderPerson

-- manejador
on extractData(inputString, regexCmd)
    try
        set capturedData to {}
        set regexResults to do shell script "printf " & inputString & " | " & regexCmd
        set {rocDateString, filename, person} to paragraphs of regexResults
        set capturedData to {rocDateString, filename, person}
    on error
        set capturedData to {"", "", ""}
    end try
    return capturedData
end extractData

Por cierto, aquí está la versión del comando en shell, para que también puedas probarlo en la terminal.

% printf "113.1.29 - 一段文字(123)" | sed -E -e 's@^.*/([[:digit:]]+\.[[:digit:]]+\.[[:digit:]].*$)@\1@' -e 's@([[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+)[[:blank:]]-[[:blank:]](.*)(\(.*\))@\1\   
\2\  
\3@ '

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X