テキストとデータの操作
SenseTalkは強力なテキスト処理能力を持っています。ここで説明するChunk Expressionsというチャンク表現は、テキスト文字列の特定の部分にアクセスし、操作するための強力で直感的な手段を提供します。また、テキストに関する情報を取得したり、テキストと他のデータ形式との間で変換したり、高レベルでテキストを操作したりするための多数のコマンドと関数があります。これらのアクションを実行するためのコマンドと関数については以下で詳しく説明します。
Capitalized
関数
動作: capitalized
関数は、各単語の最初の文字が大文字になるテキストを返します。
構文:
{the} capitalized of stringFactor
capitalized( stringExpr )
例:
put capitalized of "now and then" -- shows "Now And Then"
Related:
CharToNum
Function
動作: その引数の最初の文字を表す数値コード(Unicode)を返します。
構文:
{the} charToNum of textFactor
charToNum( textExpr )
例:
put charToNum("a") -- 97
Related:
Delete
コマンド
動作: delete
コマンドは、コンテナ内のテキストチャンクまたはターゲットテキスト文字列の1回以上の出現を削除します。最もシンプルな形では、大文字小文字を問わずターゲットテキストのすべての出現を削除します。他の形式では、位置によるチャンクの指定、ターゲット文字列の出現回数や特定の出現を削除するための指示、正確な大文字小文字のマッチングの指定が可能です。
チャンクの削除
この形式のdelete
コマンドは、値の中から任意のテキストチャンク(文字、単語、行、テキストアイテム)を削除します。削除すべきコンテナの部分を記述するチャンク表現でチャンクを指定することができます。詳細はChunk Expressionsをご覧ください。
構文:
delete chunk [of | in] container
例:
set sentence to "In a hole in the ground there lived a hobbit."
delete words 2 to 4 of sentence
put sentence —> "In the ground there lived a hobbit."
例:
delete the first 2 characters of line 15 of output
例:
delete the first line of file manual
テキストまたはパターンの削除
この形式のdelete
コマンドは、文字列内からターゲットテキスト値またはパターン(Pattern Language参照)を削除します。この形式のdelete
には、ターゲットの出現回数を指定する、あるいは特定の出現を削除するための指示をする、および正確な大文字小文字のマッチングを指定するといった多数のバリエーションが含まれます。
_targetTextOrPattern_を定義するオプションの中からひとつだけが必要で、削除が行われるコンテナも必要です。大文字小文字のオプションは任意です。使用されるオプションは任意の順序で指定することができますが、各種類のオプションは一つしか指定できません。
構文:
delete {オプション}
オプション:
[in | within | from] コンテナ
{all {occurrences of} | every {occurrence of} } 対象テキストまたはパターン
{the} [first | last] いくつか {occurrences of} 対象テキストまたはパターン
{the} 序数項 {occurrence of} 対象テキストまたはパターン
occurrence 序数 of 対象テキストまたはパターン
[with | considering] case
[without | ignoring] case
例:
delete "#" from text —> これは"#"のすべての出現を削除します
例:
delete the last "s" in word 3 of sentence
例:
delete all <punctuation or whitespace> from phoneNumber
例:
delete every occurrence of "ugly" in manual
例:
put trim(" my words ")-- "my words" (二番目のパラメータがない場合、ソースの始まりと終わりの空白を削除)
振る舞い: excludeItems
関数は、list1 からの値すべてを含むリストを返し、その中には list2 にも存在しない値も含まれます。デフォルトでは、この関数は caseSensitive
プロパティの現在の設定に従います。
put ("a".."z" &&& "A".."Z" &&& "0".."9" &&& space) into CharstoKeep2-- 後で使用するために保持する文字を変数に入れます。'joined by empty'がないと、それらはリストとして保存されます。このリストがKeepCharactersに渡されると、テキスト文字列として解釈されます。その文字列には、角括弧、二重引用符、カンマを含むすべての文字が含まれます:'["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",0,1,2,3,4,5,6,7,8,9," "]'
構文: > [insert | push] expr {nested | item by item} [before | into | after] container
_ordinalTerm_または_ordinalNumber_が指定されている場合、_targetTextOrPattern_の単一の出現のみが削除されます。_ordinalTerm_は序数のような単一の単語である必要があります。例えば、first
、second
、third
など、またはmiddle
(またはmid
)、penultimate
、last
、any
のいずれかの用語です。_ordinalNumber_は数値に評価される式である必要があります。負の場合、delete
コマンドは_container_の末尾から逆に数えて削除するべき出現を決定します。
considering caseが指定されている場合、_targetTextOrPattern_と一致する<0>container</0>内の出現のみが削除対象とされます。デフォルトでは、大文字小文字を区別せずに_targetTextOrPattern_の出現を削除します。
delete
コマンドは、削除された出現回数を示す結果(the result
関数によって返される)を設定します。
### 値を削除する {#delete-with-each}
位置による値の削除(例えば delete item 3 of myList
)に加えて、リストから特定の値を削除することもできます。これは each 式を使用して行います。例えば、テキストから "at" の単語をすべて削除するには delete each word of myText which is equal to "at"
と言います。削除する値は、each 式の where(または which または whose)句を使用して選択され、これにより高い柔軟性が提供されます。したがって、指定された値に等しいチャンクを削除するだけでなく、削除するアイテムを選択するためにほとんど任意の基準を使用することができます。 {[--gt--]} Syntax:
コマンド構文:
split sourceText {[by | using | with] listDelimiter {and keyDelimiter}}
例:
delete each item of addressList whose zip code is 80202
関連:
delete each line of testCases where the last item of each is "failed"
例:
delete each item of scores which is equal to zero
関連:
delete each line of file "entries" which is empty
関連:
delete each item of subscriberList whose expirationDate is earlier than yesterday
Related:
ExcludeItems
関数
パラメータ: beyondPosition, caseSensitive, および reverse パラメータはオプションで、target 文字列または値(検索対象)と source 文字列またはリスト(検索範囲)だけが必要です。
Syntax:
the items of list1 excluding those in list2
excludeItems( list1, list2 )
例:
put ["carrots","bananas","pistachios","lettuce","wasabi","aspirin","tissues"] into GroceryList
put ["cat food","tissues","aspirin","soda","socks"] into TargetList
put the items of GroceryList excluding those in TargetList // [carrots,bananas,pistachios,lettuce,wasabi]
Related:
Format
関数
振る舞い: Format
関数は、テンプレート文字列に定義された任意の数の値のフォーマットされたテキスト表現を返します。テンプレートは、定義された数の小数点でフォーマットされた数値、定義された最小長を満たすための余分なスペースでフォーマットされたテキスト値などを指定する特別なフォーマットコードとテキストが混在しています。
Syntax:
format( template, value1, value2, ... )
例:
set interestRate to 5.457
put format("The interest rate is %3.2f %%", interestRate) --> The interest rate is 5.46 %
例:
format(reportTemplate, day(date), month(date), description, amount)
例:
format("%x", maskValue) -- converts maskValue to hexadecimal
template 文字列は、下記の要約のように、標準的なUnix printfコマンドがサポートする 任意の形式コードを含むことができます。さらに、バックスラッシュ文字で始まる特定の「エスケープシーケンス」が以下のように変換されます:\e
— エスケープ文字; \a
— ベル文字; \b
— バックスペース文字; \f
— フォームフィード文字; \n
— 改行文字; \r
— キャリッジリターン文字; \t
— タブ文字; \v
— 垂直タブ文字; \’
— シングルクォート文字; \\` — バックスラッシュ文字;
\num` — ASCII値が1-, 2-, または3桁の8進数 num の文字。
形式コードはパーセント記号 (%
) で始まり、その値の長さと小数点以下の桁数を示すオプションの修飾子に続き、フォーマットの種類を指定する文字 (d
, i
, u
, o
, x
, X
, f
, e
, E
, g
, G
, b
, c
, s
, a
, A
, または @
) で終わります (下表参照)。パーセント記号が2つ連続 (%%
) すると、出力文字列にパーセント記号を出力することができます。
パーセント記号に続き、文字コードの前に、この値の出力長を示す数値を含む形式があるかもしれません。長さは、小数点 (.
) とその後に続く「精度」を示す別の数値に続くかもしれません。これは、数値の表示する小数点以下の桁数、または文字列から表示する最大文字数を示します。長さまたは精度は、その値が追加のパラメータから読み取られるべきであることを示すために、アスタリスク (*
) に置き換えられるかもしれません。
長さの前に 、形式コードはまた、必要に応じて以下の修飾子コードを含むこともあります:
- マイナス記号 (-) は、値が指定された長さ内で左寄せになるべきことを示します
- プラス記号 (+) は、符号付き数値形式が正の数に対してプラス記号を表示するべきことを示します
- スペース ( ) は符号付き数値形式が正の数のために追加のスペースを含むべきことを示します
- ゼロ (0) は、指定された長さを埋めるために先頭のゼロ(スペースではなく)を使用するべきことを示します
- ポンド記号 (#) は、下記に説明されているように、特定の数値形式に対して異なる方法で影響を与えます
以下の表は認識される形式コード、その意味、および例を一覧にしています:
d または i | 符号付き(正または負)の10進整数(# は効果がない):format("%4d", 27) —> " 27" format("%+-4d", 27) —> "+27 " format("%04i", 27) —> "0027" |
u | 符号なし(正でなければならない)10進整数(# は効果がない):format("%u", 27) —> "27" |
o | 符号なしの8進整数(# は先頭ゼロを強制するために精度を増す):format("%#o", 27) —> "033" |
x または X | 符号なしの16進整数(# は非ゼロ値の前に ‘0x’ または ‘0X’ を追加):format("%x", 27) —> "1b" format("%#X", 27) —> "0X1B" |
f | 符号付き固定小数点数(# は、小数点の右に数字がない場合でも、小数点が表示されることを強制します):format("%f", 27) —> "27.000000" (デフォルトの精度は小数点以下6桁) format("%7.3f", 27.6349) —> " 27.635" format("%+*.*f", 7, 2, 27.63) format("%#-5.0f", 27) —> "27. " |
e または E | 'e' または 'E' の前に指数を持つ指数表記の符号付き数値(# は、小数点の右に数字がない場合でも、小数点が表示されることを強制します)format("%e", 27)—> "2.700000e+01" format("%9.2E", 0.04567) —> "4.57E-02" |
g または G | |
c | |
s | |
b | |
a または A | |
@ | 通常のテキスト形式で表示される任意の値 |
Related:
GloballyUniqueString
関数
動作:globallyUniqueString
関数は、それが呼ばれるたびにユニークな文字列を提供します。globallyUniqueString()
を呼び出し て、識別子、キー、またはファイル名として使用するユニークな文字列を取得します。その値は、システム、アプリケーションインスタンス、そして関数への個別の呼び出しでユニークです。
構文:
the globallyUniqueString
globallyUniqueString()
例:
put globallyUniqueString() into idString
例:
set part's code to the globallyUniqueString -- パートに一意の識別子を付与します
Insert
コマンド, Push
コマンド
**動作:**リストの終わり、またはリストの特定の項目の前または後ろに値または値のリストを挿入します。
構文:
textDifference( string1, string2 )
例:
insert 5 into myList
例:
push "hedgehog" into Animalia
例:
insert newName before item index of nameList
例:
insert [3,5] nested after pointList -- ネストされたリストを作成します
例:
insert "myBuddy" before my helpers
push
コマンドはリストの末尾に値を追加します。push
と pop
コマンドはリストをスタックとして扱います。スタックにプッシュされたアイテムは、pop
コマンドを使用して 逆の順序で取得することができます。push
と pull
コマンドはリストをキューとして扱います。pull
コマンドは push
コマンドでキューに追加された順序でアイテムを一つずつ取得します。
insert
コマンドの構文を考慮すると、expr はその値が container に挿入される表現式です。before
が指定されている場合、新しい値はリストの先頭に挿入されます。after
が指定されている場合、新しい値はリストの末尾に挿入されます。into
が指定されている場合、新しい値は適切な位置(現在は常にリストの末尾)にリストに挿入されます。
もし_container_がリストの特定のアイテム(例:insert x after item 2 of myList
)として指定されている場合、before
およびafter
オプションはそれぞれ、そのアイテムの前または後に新しい値をリストに挿入します。しかし、into
オプションは、その既存のアイテムが操作され るリストであるかのように扱います。それが単一の値であれば、それは新しい値を第二のアイテムとして持つリスト(メインリスト内にネスト)になります。ターゲットとなるアイテムがすでにネストされたリストである場合、新しい値はそのリストに挿入されます。
もし_container_がリスト内のアイテムの範囲として指定されている場合、before
オプションは新しい値を範囲の最初のアイテムの前に挿入し、after
とinto
の両方のオプションは新しい値を指定された範囲の最後のアイテムの後に挿入します。
_source_がリストの場合、そのアイテムは_listDelimiter_をアイテム間で使用して結合されます。sourceがプロパティリストで、_listDelimiter_のみが与えられると、プロパティ値は_listDelimiter_を値間で使用して結合されます。_keyDelimiter_と_listDelimiter_の両方が与えられた場合、結果には各プロパティのキー(プロパティ名)がその値の前に、_listDelimiter_を使用して各エントリを区切り、_keyDelimiter_を使用してエントリ内の各キーをその値から区切ります。
insert
コマンドは宛先コンテナの何も取り除かず、また置き換えません。何かがそれに挿入されたとき、コンテナは常にリストになります、それが最初に空であったか、または未定義であったとしても。
Intersection
Function
振る舞い: intersection
関数は_list1_からのすべての値を含むリストを返し、それらの値は_list2_にも存 在します。重複する値は最終的なリストから削除されます。デフォルトでは、この関数は現在のcaseSensitive
プロパティの設定に従います。
構文:
{the} intersection of list1 [and | with] list2
intersection( list1, list2 )
{the} [common | shared] [items | values] of list1 [and | with] list2
{the} [items | values] (that are) [shared by | ((shared) in) common [to | between]] list1 [and | with] list2
{the} [items | values] [of | in] list1 (that are) (also) [shared by | ((shared) in) common [to | with] | (found) in] list2
例:
put ["carrots","bananas","pistachios","lettuce","wasabi","aspirin","tissues"] into GroceryList
put ["cat food","tissues","aspirin","soda","socks"] into TargetList
put the intersection of GroceryList and TargetList // [aspirin,tissues]
Related:
Join
Command, Join
Function
振る舞い: join
コマンド(またはその同義語combine
)は、リストのアイテムまたはプロパティリストのプロパティを、指定されたデリミタを使用して単一のテキスト値に結合します。ソース値がコンテナである場合、そのコンテナはこのコマンドの結果となるテキスト文字列を受け取ります。ソース値がnot
コンテナである場合、変数it
はソース値の要素を結合することで得られるテキストを受け取ります。with quotes
オプションは各値を引用符で囲むために使用することができます。
関数として呼び出されると、join
(またはcombine
)は結合したテキスト値を返し、これは式の一部として便利に使用できます。
Command Syntax:
[join | combine] source {[using | with | by] listDelimiter {and keyDelimiter} {[using | with] quotes {quotes}}}
Function Syntax:
[join | combine]( source {, listDelimiter {, keyDelimiter {, quotes} } } )
例:
join [1,2,3] using ":" -- note: the source value is not a container
put it -- 1:2:3
例:
combine [1,2,3] using ":" with quotes
put it -- "1":"2":"3"
例:
put [1,2,3] into numbers -- start with a list in a container
join numbers using ":" with quotes ["<<",">>"]
put numbers -- <<1>>:<<2>>:<<3>>
例:
combine{a:12,b:5} using ";" and "/"
put it -- a/12;b/5
例:
join {a:12,b:5} with "##" using quotes -- only 1 delimiter
put it -- "12"##"5"
_source_がコンテナ(変数)である場合、その変数はjoin操作の結果でテキスト値になります。そうでない場合、変数it
が結果テキストを受け取ります。
もし_expr_が単一のアイテムではなくアイテムのリストを生成する場合、そのリストはnested
オプションが指定されていた場合はネストされたリストとして一括で挿入されます。item by item
が指定されている場合はそのリストからの各アイテムが個別に宛先リストに挿入されます。どちらのオプションも指定されていない場合、挿入のタイプはローカルプロパティthe listInsertionMode
が“nested”または“item by item”に設定されている場合、またはthe defaultListInsertionMode
グローバルプロパティによって制御されます。これは初期に“item by item”に設定されています。
_listDelimiter_も_keyDelimiter_も指定されていない場合、_source_のアイテムまたはプロパティはテキスト文字列に結合され、the listFormat.Separator
、the propertyListFormat.EntrySeparator
、およびthe propertyListFormat.KeySeparator
プロパティの現在の値を適切に使用します。これはネストしたリストとプロパティリストにも適用されます。
using quotes
またはwith quotes
が指定されている場合、各値は引用符で囲まれます。_quotes_値が提供されてい る場合、それは標準のダブルクォートマークの代わりに使用されます。_quotes_がリストである場合、最初のアイテムは各値の前に、2番目のアイテムは各値の後に使用されます。
関連記事:
KeepCharacters
関数
振る舞い: テキストからすべての文字を削除し、英数字または指定した別の文字セットのみを残します。この関数は1つまたは2つのパラメータを取ります。最初のパラメータはフィルタリングされるソーステキスト値です。2つ目(オプション)のパラメータは、ソーステキスト内に保持される文字セットを定義するテキスト文字列です。2つ目のパラメータが指定されていない場合、デフォルトで文字と数字が保持されます。この関数は大文字と小文字を区別します。
構文:
keepCharacters( textExpr {, charactersToKeep} )
例:
// eとs以外のすべての文字を削除します :
put keepCharacters("SenseTalk", "es") --> ese
例:
この例では、joined by empty
がKeepCharacters
によってすべての文字が予想通りに解釈されることを保証するために使用される方法を示しています。
// この行では、後でKeepCharacters関数に渡すために保持する文字を変数に格納します。
// '空'を使用するため、テキスト文字列として格納されます。
// 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 '
put ("a".."z" &&& "A".."Z" &&& "0".."9" &&& space) joined by empty into CharstoKeep1
// これは、後で使用するために保持する文字を別の変数に格納します。
// '空'を使用しないと、リストとして保存されます。このリストがKeepCharactersに渡されると、テキスト文字列として解釈されます。
// その文字列には、角かっこ、二重引用符、コンマを含むすべての文字が含まれています。
// '["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",0,1,2,3,4,5,6,7,8,9," "]'
put ("a".."z" &&& "A".."Z" &&& "0".."9" &&& space) into CharstoKeep2
// CharstoKeep1をテキスト文字列として渡します。
put keepCharacters("Se@n[se-Ta^lk is, a gr*e]at l$angu~ag)e...!", CharstoKeep1) --> 'SenseTalk is a great language'
// CharstoKeep2(リスト)を渡し、KeepCharactersがそれを文字列として解釈します。
put keepCharacters("Se@n[se-Ta^lk is, a gr*e]at l$angu~ag)e...!", CharstoKeep2) --> 'Sen[seTalk is, a gre]at language'
put keepCharacters("Se@n[se-Ta^lk is, a gr*eat l$ang]u#ag)e...!", CharstoKeep2) -- CharstoKeep2(リスト)を渡すと、KeepCharactersはそれを文字列として解釈します。出力:'Sen[seTalk is, a great lang]uage'
"$"を12回繰り返す -- "$$$$$$$$$$$$"
構文:
{the} text of factor
text( expr )
例:
```sensetalk put length("SenseTalk") -- 9
例:
if the length of name is less than 3 \
or the length of name is greater than 12 then
put "Invalid name!"
end if
Lowercase
関数
動作: lowercase
関数は、すべて小文字(非大文字)に変換した表現を返します。
Syntax:
{the} lowercase of stringFactor
lowercase( stringExpr )
toLower()
はlowercase()
関数の同義語で、同じ構文で使用できます。
例:
put "HELLO".toLower // Shows "hello"
例:
put lowercase of "Hi There!" // Shows "hi there!"
Related:
Merge
関数
動作: ソーステキストをスキャンし、マージデリミッタで囲まれた表現の評価と置換を実行し、マージしたテキストを返します。標準的なマージデリミッタは二重の角括弧([[
と ]]
)です。ソーステキスト内にある[[ と ]]で囲まれた任意の表現は、その値に置換されます。表現は現在のコンテキストで評価され、したがってマージ表現内の任意のローカルまたはグローバル変数は、マージ関数を呼び出したハンドラでの値と同じになります。
シンプルな表現に加えて、マージデリミッタ間のテキストには任意のSenseTalkステートメントを含めることができます。これは、テキストの部分に対して繰り返しループを含めるようなことに対して非常に強力になることがあります。
最後の二つのパラメータは任意で、source 文字列だけが必要です。もし delimiter1 と delimiter2 が指定されていたら、それらはマージデリミッタとして“[[”と“]]”の代わりに使われます。もし delimiter1 だけが指定されていたら、その値は開始と終了デリミッタの両方として使われます。もし the evaluationContext
グローバルプロパティが Global
または Universal
に設定されていたら、マージプロセス中に変数はローカルではなくグローバルまたはユニバーサルとして扱われます。
!
は、merge
関数を呼び出すためのショートハンドとして引用符前に使うことができます。
Syntax:
merge( source {, delimiter1 {, delimiter2}} )
!" source "
例:
put "Jorge" into name
put merge("Hello [[name]], how are you?") -- 表示 "こんにちは Jorge, お元気ですか?"
例:
put merge of "[[repeat with n=0 to 99]][[n]],[[end repeat]]" \
into numbersList
例:
put ("cat", "dog", "rabbit", "fish") into pets
put merge of "[[repeat with each item of pets]][[put it]][[end repeat]]"
-- ネコ
犬
ウサギ
魚
例:
put merge(template) into file "/Library/WebServer/Documents/report"
例:
put "September" into monthName
put !"今月は [[monthName]]です" -- "今月は9月です"
Number of
Operator
Behavior: この演算子は、of
の前にリテラル数値が必要であり、変数ではない。この演算子は数値や単位の分数に有用です。もし値が数値またはリストなら、それは数値で掛け算されます。そうでなければ、of
演算子はそれを繰り返し演算子のように繰り返します。
Syntax:
fraction of aUnit
literalNumber of text {as {a} list}
literalNumber of numberOrList {as {a} list}
例:
put three hundredths of an inch -- 0.03 inches
例:
put five of "#" -- "#####"
例:
put 12 of [1,2,3] -- [12,24,36]