AppleScriptで文字列を処理する(3)

文字を検索して位置を教えてくれる「offset」

 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となります。最初に見つかった検索文字列の位置が返ってきます。

3番目の単語の位置が知りたいのだが・・・(疑問編)

 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番目の単語の位置が知りたいのだが・・・(解決編)

 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)

to Script Index