2009-07-15 7 views
2

J'ai le défi en AppleScript pour manipuler une chaîne comme suit:manipulation de chaînes dans AppleScript

  • chaîne de base est un nom d'affichage du destinataire du courrier électronique, dire: First Last ([email protected])
  • Je voudrais « couper » la Nom d'affichage pour supprimer l'adresse e-mail réelle entre crochets
  • Le résultat souhaité doit être First Last - l'espace devant le premier support doit donc être supprimé.

Quelle est la meilleure façon de le faire dans AppleScript?

Répondre

3
set theSample to "First Last ([email protected])" 

return trimEmailAddress(theSample) 
-->Result: "First Last" 

on trimEmailAddress(sourceAddress) 
    set AppleScript's text item delimiters to {" ("} 
    set addressParts to (every text item in sourceAddress) as list 
    set AppleScript's text item delimiters to "" 
    set nameOnly to item 1 of addressParts 

    return nameOnly 
end trimEmailAddress 
+1

Excellente solution. L'extraction de la partie nommée uniquement peut être simplifiée pour 'définir nameOnly sur le premier élément de texte de sourceAddress', évitant ainsi d'avoir besoin des instructions auxiliaires impliquant' addressParts'. – mklement0

1

Vous pouvez utiliser une solution plus simple comme ceci:

set theSample to "First Last ([email protected])" 

on trimEmailAddress(sourceAddress) 
    set cutPosition to (offset of " (" in sourceAddress) - 1 
    return text 1 thru cutPosition of sourceAddress 
end trimEmailAddress 

return trimEmailAddress(theSample) 
--> "First Last" 
+0

> le texte 1 à 2 de "xyz" est équivalent aux éléments 1 à 2 de "xyz" comme chaîne Oh! Merci Lauri pour le pourboire, je ne connaissais pas celui-ci !! – Zitoun

3

J'utilise également des compensations. text 1 thru 2 of "xyz" est équivalent à items 1 thru 2 of "xyz" as string.

set x to "First Last ([email protected])" 
set pos to offset of " (" in x 
{text 1 thru (pos - 1) of x, text (pos + 2) thru -2 of x} 

Pour autant que je sache, you don't have to restore text item delimiters.

set x to "First Last ([email protected])" 
set text item delimiters to {" (", ")"} 
set {fullname, email} to text items 1 thru 2 of x 

Si d'autres étaient à la recherche de la manipulation de chaînes en général, voici les méthodes de remplacement et le texte du fractionnement et des listes de rejoindre:

on replace(input, x, y) 
    set text item delimiters to x 
    set ti to text items of input 
    set text item delimiters to y 
    ti as text 
end replace 

on split(input, x) 
    if input does not contain x then return {input} 
    set text item delimiters to x 
    text items of input 
end split 

on join(input, x) 
    set text item delimiters to x 
    input as text 
end join 

comparaisons de chaînes Ignore la casse par défaut:

"A" is "a" -- true 
"ab" starts with "A" -- true 
considering case 
    "A" is "a" -- false 
    "ab" starts with "A" -- false 
end considering 

Renverser le texte:

reverse of items of "esrever" as text 

Vous pouvez utiliser do shell script pour changer la casse du texte:

do shell script "printf %s " & quoted form of "aä" & " | LC_CTYPE=UTF-8 tr [:lower:] [:upper:]" without altering line endings

écho interprète de séquences d'échappement par défaut dans OS X de/bin/sh. Vous pouvez également utiliser shopt -u xpg_echo; echo -n au lieu de printf %s. LC_CTYPE=UTF-8 fait que les classes de caractères incluent des caractères non-ASCII. Si without altering line endings est omis, les sauts de ligne sont remplacés par des retours chariot et un saut de ligne à la fin de la sortie est supprimé. Divise les chaînes autour de \ n, \ r et \ r \ n. Il ne supprime pas les délimiteurs.

paragraphs of ("a" & linefeed & "b" & return & "c" & linefeed) 
-- {"a", "b", "c", ""} 

La version en texte brut du presse-papiers utilise des fins de ligne CR. Il convertit les fins de ligne LF:

set text item delimiters to linefeed 
(paragraphs of (get the clipboard as text)) as text 

Unicode text a été équivalent à text et string depuis 10.5:

Il n'y a plus de distinction entre Unicode et texte non-Unicode. Il y a exactement une classe de texte, nommée "text": c'est-à-dire, la classe de "foo" renvoie le texte.