文字列の追加・削除

文字列に追加する

 文字列にさらに文字列を追加するには&結合演算子を使います。

"Aパーツ" & "コア" & "Bパーツ"

 これは、簡単に分かると思いますが、意外に忘れがちなのが、リストを文字列に変換すると、リストの要素が全て結合されると言うことです。
 この方法の利点は、文字列以外のものを多く含んだり、もともとリストだったりするものの結合や、結合の前処理としてリスト操作を使いたい場合の扱いやすさにあります。
 また、文字列の結合時にはtext item delimitersがリストの要素の間に挟まれますから、これを利用して結合時に文字列の整形をすることもできます。

{"Aパーツ", "コア", "Bパーツ"} as string

 display dialogの引数に使う場合など、リストから文字列への変換を利用すると分かりやすくなることもあります。

display dialog {"結果は", 100, "と出ました。", return, "よろしいですか?"} as string

 文字列の頭や後ろに文字列を追加する場合、文字列を&で結合するよりも、一度リストにして結合していった方が高速に処理できます。これは、リストには前後に値を加える方法が&で連結する以外にも用意されていて、その方法が高速だからです。
 特に大量に処理する必要がある場合は、いったん文字列をリストにしておいて、連結が終了したところで文字列に戻す方がいいでしょう。
 詳しくは、「リスト項目の追加・削除」を参照して下さい。

文字列の一部を削除する

 文字列の一部を削除したり入れ替えたりしたい場合があります。「delete word 3 of theText」という感じで削除できればいいのですが、それはできません。
 文字列の最初から削除したい部分の直前までと、削除したい部分の直後から文字列の最後までを取り出して、それぞれを結合することになります。

delWord of "Hello,I am Macintosh!" at 3

on delWord of theText at n
	if n <= 1 then
		return (text from word 2 to word -1 of theText)
	else if n >= number of words in theText then
		return (text from word 1 to word -2 of theText)
	else
		return (text from word 1 to word (n - 1) of theText) & " " & (text from word (n + 1) to word -1 of theText)
	end if
end delWord

 最初の単語か最後の単語をさす場合は、if文で場合分けしたりしていて、今一つスマートではありませんので、別の方法を考えてみます。
 文字列を扱う時は、わりと良く行われることですが、いったんリストに分解してから処理し、as string(text)で結合するという方法を使います。
 文字列の結合時にはtext item delimitersがリストの要素の間に挟まれます。
 ただ、この場合wordは半角スペースの他に、改行、コンマ、タブ、スラッシュなどの記号でも分割され、日本語の場合は、かなと漢字の境でも分割されるので、元の文字列とはかなり異なったものが返されてしまう可能性もあります。
 あと、注意するのは削除するitemを空文字列("")ではなく、数値の0に設定していることで、こうすることで、後でstrings of theListという形で、削除したい部分以外を取り出すことができます。

delWord of "Hello,I am Macintosh!" at 2

on delWord of theText at n
	set theList to words of theText
	set item n of theList to 0
	set tmp to text item delimiters
	set text item delimiters to " " -- 文字列化する時にスペースを挟む
	set theText to (strings of theList) as string
	set text item delimiters to tmp
	return theText
end delWord

 文字列の一部を削除するという行為は、AppleScriptの元になったHyperTalkでは簡単に行えるだけに、なんで進化したはずのAppleScriptがこのような七面倒なことをやらなければいけないのか、納得いかないところです。

文字列に挿入する

 今度は逆に、文字列の任意の場所に文字列を挿入してみます。
 これは、先ほど行った、削除スクリプトの応用で簡単にできます。
 まずは、リスト分解しない方法。

addWord of "new" at 3 on "Hello,I am Macintosh!"

on addWord of addText at n on theText
	if n <= 1 then
		return (word 1 of theText) & " " & addText & (text from word 2 to word -1 of theText)
	else if n >= number of words in theText then
		return theText & " " & addText
	else
		return (text from word 1 to word (n - 1) of theText) & " " & addText & " " & (text from word (n + 1) to word -1 of theText)
	end if
end addWord

 今度は、一度リストに分解する方法。

addWord of "new" at 3 on "Hello,I am Macintosh!"

on addWord of addText at n on theText
	set theList to words of theText
	set item n of theList to (item n of theList) & " " & addText
	set tmp to text item delimiters
	set text item delimiters to " "
	set theText to theList as text
	set text item delimiters to tmp
	return theText
end addWord

テキストエディタを使う

 ことほど左様にややこしい文字列の扱いも、テキストエディタ上で行うとなると、状況は一変します。
 削除・挿入自由自在。検索・置換何でもござれ、といったところです。もちろんテキストエディタが対応していたらの話ですが。
 ここでは、QuoEditを使ったスクリプトの例を紹介します。

tell application "QuoEdit"
	tell document 1
		set contents to "Hello,I am Macintosh!"
		delete word 3
		set word 2 to "You"
		set after word 3 to " user"
	end tell
end tell

 テキストエディタを使った文字列の操作は、実に様々な処理が可能で、柔軟性に富んでいますから、ここで解説するには幅が広すぎますので、幾つかの項目に分けて、別に紹介することにします。


2000-03-01 2000-03-30