Управление строками в AppleScript
У меня есть проблема в AppleScript, чтобы манипулировать строкой следующим образом:
- Базовая строка - это отображаемое имя получателя электронной почты, например:
First Last (first.last@hotmail.com)
- Я хотел бы "обрезать" отображаемое имя, чтобы удалить фактический адрес электронной почты в скобках
- Желаемый результат должен быть
First Last
- поэтому пространство перед первым кронштейном должно быть удалено.
Какой самый лучший и самый эффективный способ сделать это в AppleScript?
3 ответа
set theSample to "First Last (first.last@hotmail.com)"
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
Я также использовал бы смещения. text 1 thru 2 of "xyz"
эквивалентно items 1 thru 2 of "xyz" as string
,
set x to "First Last (first.last@hotmail.com)"
set pos to offset of " (" in x
{text 1 thru (pos - 1) of x, text (pos + 2) thru -2 of x}
Насколько я знаю, вам не нужно восстанавливать разделители текстовых элементов.
set x to "First Last (first.last@hotmail.com)"
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, чтобы изменить регистр текста:
do shell script "printf %s " & quoted form of "aä" & " | LC_CTYPE=UTF-8 tr [:lower:] [:upper:]" without altering line endings
echo интерпретирует escape-последовательности по умолчанию в OS X /bin/sh. Вы также можете использовать 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. Это преобразует окончания строки в LF:
set text item delimiters to linefeed
(paragraphs of (get the clipboard as text)) as text
Unicode text
был эквивалентен с text
а также string
с 10.5:
Больше нет различия между Unicode и не-Unicode текстом. Существует ровно один текстовый класс с именем "text", то есть класс "foo" возвращает текст.
Вы можете использовать более простое решение, подобное этому:
set theSample to "First Last (first.last@hotmail.com)"
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"