AppleScript: ¿Cómo extraer una sección de una cadena (basada en caracteres definidos)?

2

Ejemplo:

set theText to "I ate an apple at 11:54 pm without the skin."

Me gustaría que theTime sea una cadena que contenga el texto: 11:54

Por lo tanto, me gustaría que el delimitador del elemento de texto de apertura sea at_ y que el delimitador del elemento de texto de cierre sea _pm o _am , dependiendo del período existente en la cadena. (Nota: cada instancia de un guión bajo en esta publicación está destinada a representar un espacio porque no puedo representar un espacio en el formato del código de intercambio de pila).

El contenido de theText variará enormemente. Por ejemplo, podría ser:

set theText to "I ate two navel oranges at 6:30 am with a glass of water."

Pero el formato de tiempo siempre se mantendrá constante. El tiempo siempre estará precedido por un "at" y ese "at" siempre será la primera instancia de un "at" en la cadena. De manera similar, el tiempo necesariamente será seguido por "am" o "pm".

    
pregunta rubik's sphere 17.01.2017 - 05:11

2 respuestas

2

Ejecutando el siguiente código de AppleScript en el Editor de AppleScript:

set theText to "I ate an apple at 11:54 pm without the skin."
set theTime to do shell script "awk -F ' at | am | pm ' '{print $2}'<<<" & quoted form of theText
log "The time was: " & theTime

set theText to "I ate two navel oranges at 6:30 am with a glass of water."
set theTime to do shell script "awk -F ' at | am | pm ' '{print $2}'<<<" & quoted form of theText
log "The time was: " & theTime

Produce la siguiente salida en el registro de eventos del editor de AppleScript:

tell current application
    do shell script "awk -F ' at | am | pm ' '{print $2}'<<<'I ate an apple at 11:54 pm without the skin.'"
        --> "11:54"
    (*The time was: 11:54*)
    do shell script "awk -F ' at | am | pm ' '{print $2}'<<<'I ate two navel oranges at 6:30 am with a glass of water.'"
        --> "6:30"
    (*The time was: 6:30*)
end tell

En los ejemplos anteriores, he definido los separadores de campo (delimitadores) en awk usando la opción -F como ' at | am | pm ' que equivale a "en "," am "y" pm "e imprime '{print $2}' lo que hay entre los separadores de campo .

Nota: el uso del comando log no es necesario para la codificación de la respuesta y se usa solo para mostrar cuál es el valor de theTime contiene para la salida del registro de eventos, aparte de lo que se muestra después de --> , que es el resultado como se muestra normalmente en el registro de eventos.

Actualización: escribí mi respuesta original basada en una interpretación literal que decía, " Por lo tanto, me gustaría que el delimitador del elemento de texto inicial fuera at_ y el delimitador del elemento de texto de cierre sea _pm o _am ", lo que se buscaba era usarlos literalmente como delimitadores. Sin embargo, como se presentó una solución diferente que utiliza puro código de AppleScript, en una respuesta por separado, permítanme presentarles una solución AppleScript código de una línea hace lo mismo que hacen las 8 líneas de pure código de AppleScript y al centrarse en dos puntos , pero como parte de un RegEx representación del tiempo en horas y minutos.

set theTime to do shell script "awk 'match($0,/[0-9]{1,2}:[0-5][0-9]/) {print substr($0,RSTART,RLENGTH)}'<<<" & quoted form of theText

Ejecutando el siguiente código de AppleScript en el Editor de AppleScript:

set theText to "I ate an apple at 11:54 pm without the skin."
set theTime to do shell script "awk 'match($0,/[0-9]{1,2}:[0-5][0-9]/) {print substr($0,RSTART,RLENGTH)}'<<<" & quoted form of theText

set theText to "I ate two navel oranges at 6:30 am with a glass of water."
set theTime to do shell script "awk 'match($0,/[0-9]{1,2}:[0-5][0-9]/) {print substr($0,RSTART,RLENGTH)}'<<<" & quoted form of theText

Produce la siguiente salida en el registro de eventos del editor de AppleScript:

tell current application
    do shell script "awk 'match($0,/[0-9]{1,2}:[0-5][0-9]/) {print substr($0,RSTART,RLENGTH)}'<<<'I ate an apple at 11:54 pm without the skin.'"
            --> "11:54"
    do shell script "awk 'match($0,/[0-9]{1,2}:[0-5][0-9]/) {print substr($0,RSTART,RLENGTH)}'<<<'I ate two navel oranges at 6:30 am with a glass of water.'"
            --> "6:30"
end tell

Como puede ver, si hay o no uno o dos números que preceden a los dos puntos, RegEx coincide y el awk programa devuelve la coincidencia deseada, de la cual es la hora.

Personalmente, elegiría usar este método en particular sobre mi respuesta original, ya que es un método mejor en estas circunstancias, o sobre el pure AppleScript code como No puedo justificar la escritura de 8 líneas de puro código de AppleScript cuando una sola línea de regular AppleScript código produce el ¡Los mismos resultados que hacen las 8 líneas!

    
respondido por el user3439894 17.01.2017 - 12:20
2

Puede hacerlo con AppleScript puro, aunque el método de script de shell presentado anteriormente es muy bueno:

set theText to "I ate an apple at 11:54 pm without the skin."
set the_colon_location to offset of ":" in theText
-- now we know where the colon is.
-- The Time is going to be on either side of it.
set the_starting_point to the_colon_location - 2
set the_ending_point to the_colon_location + 5
set the_time_string to characters the_starting_point thru the_ending_point of theText as string
-- in case the hour is not two digits, the first character will be a space
if character 1 of the_time_string is " " then
    set the_time_string to characters 2 thru -1 of the_time_string as string
end if
return the_time_string
    
respondido por el Christian Boyce 18.01.2017 - 04:17

Lea otras preguntas en las etiquetas