2009-11-11 2 views
7

Я хочу создать функцию, которая возвращает подстроку определенной строки с начала указанной строки до, но не включая начало другой конкретной строки. Идеи?AppleScript: индекс подстроки в строке


Так что-то вроде:

substrUpTo(theStr, subStr) 

так, если я введенный substrUpTo("Today is my birthday", "my"), она возвращает подстроку первого аргумента до, но не включая, где начинается второй аргумент. (Т.е. он будет возвращать "Today is ")

ответ

9
set s to "Today is my birthday" 
set AppleScript's text item delimiters to "my" 
text item 1 of s 
--> "Today is " 
+0

Следует, наверное, отметить, что наилучшей практикой является то, что разделители текстовых элементов следует сбрасывать обратно в пустую строку сразу же после этого, чтобы избежать возможных возможных странных ошибок позже. –

+2

Лучшей практикой является всегда устанавливать значения TID на соответствующее значение непосредственно перед использованием разделителей текстовых элементов или принудительного ввода-вывода (как неявного, так и явного). Это единственный способ убедиться, что ваш код не подвержен ошибкам (т. Е. Защищенному программированию). Вежливая практика заключается в том, чтобы сохранить существующие TID во временной переменной, а затем восстановить их, как только вы закончите (т. Е. Глобальное свойство «разделителей текстовых элементов» в найденном вами состоянии). Целесообразно сделать это в обработчиках, если строка кода, вызывающая обработчик, делает что-то с TID сразу после этого. – has

0

Возможно немного kludgey, но он получает работу ...

property kSourceText : "Today is my birthday" 
property kStopText : "my" 

set newSubstring to SubstringUpToString(kSourceText, kStopText) 

return newSubstring -- "Today is " 

on SubstringUpToString(theString, subString) -- (theString as string, subString as string) as string 

    if theString does not contain subString then 
     return theString 
    end if 

    set theReturnString to "" 

    set stringCharacterCount to (get count of characters in theString) 
    set substringCharacterCount to (get count of characters in subString) 
    set lastCharacter to stringCharacterCount - substringCharacterCount 

    repeat with thisChar from 1 to lastCharacter 
     set startChar to thisChar 
     set endChar to (thisChar + substringCharacterCount) - 1 
     set currentSubstring to (get characters startChar thru endChar of theString) as string 
     if currentSubstring is kStopText then 
      return (get characters 1 thru (thisChar - 1) of theString) as string 
     end if 
    end repeat 

    return theString 
end SubstringUpToString 
1

Встроенный offset команды должен сделать это:

set s to "Today is my birthday" 
log text 1 thru ((offset of "my" in s) - 1) of s 
--> "Today is " 
Смежные вопросы