AppleScript: come estrarre la sezione dalla stringa (in base ai caratteri definiti)?

2

Esempio:

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

Vorrei che theTime sia una stringa che contiene il testo: 11:54

Quindi, vorrei che il delimitatore di testo di apertura fosse at_ e il delimitatore di testo di chiusura fosse o _pm o _am , a seconda del periodo esistente nella stringa. (Nota: ogni istanza di un carattere di sottolineatura in questo post è pensata per rappresentare uno spazio perché non riesco a rappresentare uno spazio nella formattazione del codice Stack Exchange.)

Il contenuto di theText varierà notevolmente. Ad esempio, potrebbe essere:

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

Ma il formato dell'ora rimarrà sempre costante. Il tempo sarà sempre preceduto da un "at" e che "at" sarà sempre la prima istanza di un "at" nella stringa. Allo stesso modo, il tempo sarà necessariamente seguito da "am" o "pm".

    
posta rubik's sphere 17.01.2017 - 05:11
fonte

2 risposte

2

In esecuzione il seguente codice AppleScript in AppleScript Editor:

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 il seguente output nel registro eventi di AppleScript Editor:

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

Negli esempi precedenti ho definito i separatori di campi (delimitatori) in awk usando l'opzione -F come ' at | am | pm ' che equivale a "a "," am "e" pm "e stampa '{print $2}' cosa c'è tra i separatori di campi .

Nota: l'uso del comando log non è necessario per la codifica della risposta e viene utilizzato solo per mostrare quale sia il valore di theTime contiene per l'output del registro eventi a parte ciò che viene mostrato dopo --> , che è il risultato come normalmente mostrato nel registro eventi.

Aggiornamento: ho scritto la mia risposta originale sulla base di un'interpretazione letterale in cui, quando detto, " quindi, vorrei che il delimitatore di testo di apertura fosse at_ e il delimitatore di testo di chiusura fosse o _pm o _am ", quello che volevo era usare letteralmente quelli come delimitatori. Tuttavia, poiché è stata presentata una soluzione diversa che utilizza puro codice AppleScript , in una risposta separata, mi permetta di presentare una soluzione code di AppleScript su una riga fa la stessa cosa che fanno le 8 linee del puro codice AppleScript e concentrandosi sui due punti , ma come parte di un Rappresentazione di RegEx del tempo in ore e minuti.

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

In esecuzione il seguente codice AppleScript in AppleScript Editor:

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 il seguente output nel registro eventi di AppleScript Editor:

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

Come puoi vedere, indipendentemente dal fatto che ci siano o meno da uno a due numeri prima dei due punti, la RegEx corrisponde e il awk programma restituisce la corrispondenza desiderata, di cui è il momento.

Personalmente, sceglierei di utilizzare questo particolare metodo rispetto alla mia risposta originale, in quanto è un metodo migliore in queste circostanze e o sopra il puro codice AppleScript come Non riesco a giustificare la scrittura di 8 righe di pure codice AppleScript quando una singola riga di regolare codice AppleScript produce il stessi risultati delle 8 linee!

    
risposta data 17.01.2017 - 12:20
fonte
2

Puoi farlo con AppleScript puro, anche se il metodo dello script di shell presentato sopra è molto carino:

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
    
risposta data 18.01.2017 - 04:17
fonte

Leggi altre domande sui tag