2009-07-15 3 views
2

У меня есть проблемы в AppleScript манипулировать строку следующим образом:Строка манипуляции в AppleScript

  • Базовой строкой является отображаемым именем получателя электронной почты, говорят: First Last ([email protected])
  • Я хотел бы, чтобы «обрезать» отображаемое имя для удаления фактического адреса электронной почты в скобках
  • Желаемый результат должен быть First Last - так что пространство перед первой скобой необходимо удалить.

Каков наилучший и эффективный способ сделать это в AppleScript?

ответ

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

Отличное решение. Удаление части, основанной только на имени, может быть упрощено для 'set nameOnly для первого текстового элемента sourceAddress', устраняя необходимость в вспомогательных операторах, связанных с' addressParts'. – mklement0

1

Вы можете использовать более простое решение, как это:

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

> текст 1 до 2 из "xyz" эквивалентен пунктам 1 по 2 из "xyz" как строка Oh! Спасибо Лаури за подсказку, не знал этого! – Zitoun

3

Я бы также использовать коррекции. text 1 thru 2 of "xyz" эквивалентно 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} 

Насколько я знаю, 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 

Если другие обыскивали о манипуляции строки в общем, вот способы замены и разделения текста и объединения списков:

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 

сравнения строк игнорируют случай по умолчанию:

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

Обратный текст:

reverse of items of "esrever" as text 

Вы можете использовать сделать скрипт для изменения регистра текста:

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

эхо интерпретирует управляющие последовательности по умолчанию в OS X в/бен/ш. Вы также можете использовать shopt -u xpg_echo; echo -n вместо printf %s. LC_CTYPE=UTF-8 содержит классы символов, включающие некоторые символы, отличные от ASCII. Если without altering line endings не учитывается, переводы строк заменяются возвратом каретки и удаляется новая строка в конце вывода.

paragraphs of разделяет строки вокруг \ n, \ r и \ r \ n. Он не разделяет разделители.

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

В текстовой версии буфера обмена используются линии линии CR. Это преобразует концы строк в ЛФ:

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

Unicode text был эквивалентен text и string так 10.5:

Существует больше нет различия между Unicode и текстом, не Unicode. Существует ровно один текстовый класс с именем «текст»: то есть класс «foo» возвращает текст.

Смежные вопросы