AppleScriptで、テキストの中にある特定の文字列の位置を知るのは、ちょっと面倒です。
あらかじめ検索したい文字がわかっているなら、offsetを使います。書き方は、
offset of "検索したい文字列" in "検索対象となるテキスト"
です。返ってくる答えは、検索したい文字列の先頭位置(数字)です。
たとえば
set cn to the offset of "l" in "I love you"
display dialog "cn:" & cn
cnは3となります。
同じ文字が一つの文字列に何度も現れる場合はどうか。
たとえば"I love you very, very much"の中でveryはどこにあるか、offsetで調べてみると
set cn to the offset of "very" in "I love you very, very much"
display dialog "cn:" & cn
というわけで、答えは、12となります。最初に見つかった検索文字列の位置が返ってきます。
offsetでテキスト処理をするときは、この、同じ文字列が繰り返す場合に注意する必要があります。
たとえば、次のようなテキストデータがあったとします。
I love you
you love me
I love me
you love you
各行の3番目の単語の位置を次々と調べようとして、以下のように書いたとします。
set sample_text to "I love you
you love me
I love me
you love you"
repeat with x from 1 to 4
set ptext to paragraph x of sample_text
set wtext to word 3 of ptext
set cn to the offset of wtext in ptext
display dialog "cn:" & cn
end repeat
さて実行してみるとどうなるか。
1行目から3行目までは、8,10,8...と、3番目の単語の位置を知らせてくれます。ところが、4行目になると、突然「1」という答えが返ってきます。
これは"you love you”という一行の中に"you"が二回繰り返されているからです。プログラムはまず、3つめの単語"you"を拾いあげ、同じ単語が1つめにも見つかったので「1」という答えを返してくるのです。
3番目の単語の位置を知りたいときに、文字内容と関係なく、何文字目かをずばり返してくれるコマンドはないものか。あったら便利なのになあ。残念ながら、わたしはまだ適当なコマンドを探しあぐねております。
が、以下のようにtext fromを使うと、なんとか解決できそうです。
set tc to text from word 1 to word 2 of "I love you very much"
set ltc to the length of tc
display dialog ltc+2
ずばり3番目の先頭がわからないなら、2番目の単語までの長さを求めてしまおうというわけです。 最後に+2と入れるのは、区切り文字で+1、さらに次が3番目の単語の先頭なので+2というわけです。
(2008.08.06)