チャンクタイプ
チャンク表現は、次のすべてのチャンクタイプで作業することを可能にします:
タイプ | 定義 |
---|---|
characters | テキスト内の個々の文字 |
words | テキスト内の任意の量の空白(スペース、タブ、リターン)で区切られた単語 |
lines | いくつかの標準的な行末(CR、LF、CRLFなど)で区切られた段落 |
text items | カンマで区切られたテキストの部分 |
list items | リスト内の個々のアイテム |
bytes | バイナリデータ内のバイト |
occurrences | 定義されたパターンのテキスト一致 |
matches | 定義されたパターンとそのキャプチャグループのテキスト一致とテキスト範囲 |
さらに、テキストアイテム、行、単語を識別するために使用されるカスタムデリミタを指定することができ、さらに高い機能性を提供します。これら3つのテキストチャンクタイプはそれぞれ独特のタイプのデリミタを持ち、テキストアイテムは単一のテキスト文字列で区切られ、行はテキスト文字列のリストで区切られ、単語は文字セットからの任意の数と組み合わせの文字で区切られます。
Characters
最も単純なタイプのチャンクはキャラクターチャンクです。キャラクターはテキストの一文字で、表示文字と非表示文字(タブ、キャリッジリターン、ラインフィード文字などのコントロール文字を含む)の両方を含みます。character
はchar
と略すことができます。
put "The quick brown fox" into animal
put character 1 of animal--> T
put the last char of animal --> x
put chars 3 to 7 of animal --> e qui
Words
単一の単語は、空白文字を含まない文字列、または引用符で囲まれた文字列として定義されます。単語の範囲には、指定された最初の単語から最後の単語までのすべての文字、および間にあるすべての単語と空白が含まれます。空白文字は、スペース、タブ、およびリターン(改行)です。
put "Sometimes you feel like a nut; sometimes you don’t." into slogan
put the second word of slogan --> you
put word 6 of slogan --> nut;
put words 1 to 3 of slogan --> Sometimes you feel
引用符で囲まれたフレーズは、通常は引用符を含む単一の単語として扱われます:
put <<Mary said "Good day" to John.>> into sentence
put the third word of sentence --> "Good day"
関連するローカルおよびグローバルプロパティ
SenseTalkは、チャンク内の単語を操作する際の側面を管理するために使用できるローカルおよびグローバルプロパティを含みます。単語を識別するために使用される文字セットは、the wordDelimiter
ローカルプロパティまたはthe defaultWordDelimiter
グローバルプロパティを設定することで、Space、Tab、およびReturn以外のものに変更することができます。引用符付き単語を識別するために使用される引用符文字(または単語引用が完全に無効化されるかどうか)は、the wordQuotes
ローカルプロパティまたはthe defaultWordQuotes
グローバルプロパティを使用して指定できます。
これらのローカルプロパティはチャンク表現のローカルおよびグローバルプロパティで定義されています:
the wordDelimiter, the defaultWordDelimiter
the wordQuotes, the defaultWordQuotes
行
行チャンク式を使用すると、対象テキスト内の1つ以上の行または段落を指定できます。行は初めて定義されるとき、標準的な行末文字の間の文字として定義されます。
put "line 1" & return & "line 2" & return & "line 3" into text
put the second line of text --> line 2
put line 6 of text --> ""
put lines 2 to 3 of text --> line 2 & return & line 3
--> line 2
--> line 3
関連するローカルおよびグローバルプロパティ
SenseTalkは、チャンク内の行を操作する側面を管理するために使用できる2つのプロパティを含みます。行として定義するための行末(デリミタ文字列)のセットは、the lineDelimiter
ローカルプロパティを設定することでデフォルト以外のものに変更することができます。the lineDelimiter
を空に設定すると、デフォルトリストに戻ります。
the defaultLineDelimiter
グローバルプロパティはデフォルトの行デリミタセットを定義します。このプロパティは初めて設定されたときに、CRLF、Return、CarriageReturn、LineSeparator、ParagraphSeparatorに設定されます。
これらのプロパティはチャンク表現のローカルおよびグローバルプロパティで定義されています:
the lineDelimiter, the defaultLineDelimiter
テキスト項目
テキスト内の項目は通常、コンマ間のテキスト部分として定義されます:
put "A man, a plan, a canal. Panama!" into palindrome
put item 2 of palindrome --> " a plan"
区切り(デリミタ)文字は、the itemDelimiter
プロパティを設定することでコンマ以外の何かに指定できます。the itemDelimiter
のデフォルト値は、the defaultItemDelimiter
グローバルプロパティによって決まります。これら2つのプロパティはチャンク表現のローカルおよびグローバルプロパティで定義されています:
the itemDelimiter, the defaultItemDelimiter
リスト項目
items
という単語は、リスト内の要素を指すこともあります。
put ["red", "green", "blue"] into colors
put item 2 of colors -- green
SenseTalkは、値がリストであるかどうかによって、item
がテキスト項目を指すのかリスト項目を指すのかを判断します。値がリスト内の項目を指す場合、SenseTalkは自動的に参照がリスト項目であると仮定し、テキスト項目ではないとします。ただし、itemDelimiter
が“”(空)に設定されている場合、items
はテキスト項目ではなくリスト項目を指すでしょう。項目の取り扱い方法を制御する必要がある場合、一般的なitems
の代わりにlist items
またはtext items
を明示的に指定することができます。これは、以下のように個々の項目に値を入れてリストを作成しようとしている場合に特に重要です:
put 1 into myText -- 1
put 2 into item 2 of myText
put mytext -- 1,2
上記のコードは、中央の文字がitemDelimiter
であるテキスト文字列を生成します(itemDelimiter
がempty
に設定されていない場合)。テ キストではなくリストを生成するには、list item
を指定します:
put 1 into myList -- 1
put 2 into list item 2 of myList
put myList -- [1,2]
リストの操作に関する詳細はリストおよびプロパティリストを参照してください。
Bytes
byte
チャンクは、バイナリデータの一部を参照するために使用できます。
set the defaultDataFormat to "auto"
put <3f924618> into binaryData
put byte 2 of binaryData -- <92>
バイナリデータの操作には、バイトチャンクについての詳しい情報があります。
Occurrences
occurrence
とoccurrences
の語は、文字列のチャンクとしてパターンマッチにアクセスし、マッチしたテキストを返すことができます。occurrence
を使って、文字列内のパターンの特定の単一の出現にアクセスし、occurrences
を使って出現のリストを返します。
occurrence
の同義語としてinstance
を、そして全ての場合でoccurrences
の代わりにinstances
を使用することができます。
例:
put occurrence 4 of <digit> in "V2.7 for 4/3/18" --> 3
例:
set proverb to "If wishes were horses, beggars would ride"
set wordEndingWithS to <start of word, word chars, word ending with "s">
put occurrence 2 of wordEndingWithS in proverb -- horses
範囲の出現をリクエストすると、ソース文字列の部分文字列ではなく、値のリストが返されます。
例:
前の例のSetコマンドと一緒に使用すると、
put instances 1 to 3 of wordEndingWithS in proverb -- [wishes,horses,beggars]
例:
put instances 3 to 5 of <digit> in "V2.7 for 4/3/18" -- [4,3,1]
put the first 3 occurrences of <max digits> in "42-16gh9-88" -- [42,16,9]
パターンの使用については、SenseTalkパターン言語の基礎を参照してください。
Matches
matches
キーワードは、文字列のチャンクとしてパターンにアクセスできるようにします。返され る値は、マッチ全文をtext
プロパティとして、マッチの範囲をtext_range
プロパティとして含むマッチプロパティリストです。
matches
を使用して範囲をリクエストすると、パターンの各マッチに対する1つのプロパティリストを含むプロパティリストのリストが返されます。
put the second match of <3 digits> in "987654321" -- {text:"654", text_range:"4" to "6"}
put the last 2 matches of <max digits> in "42-16gh9-88" -- [{text:"9", text_range:"8" to "8"},{text:"88", text_range:"10" to "11"}]
パターンの使用については、SenseTalkパターン言語の基礎を参 照してください。
Custom Chunks
標準のword
、line
、text item
のチャンクはそのままでも多くのことに役立ちます。しかし、特定の形式のテキストを他の方法で分割したい場合もあります。例えば、多くのプログラムは、各行にタブ文字で区切られたいくつかの値を含むデータファイルを生成することができます。
このようなデータを扱う一つの方法は、the itemDelimiter
をtab
に設定し、各行のitems
にアクセスすることです。しかし、各タブで区切られたアイテムがカンマで区切られたいくつかの値を含むと仮定しましょう。これらの値に個々にアクセスするためには、the itemDelimiter
をタブとカンマの間で切り替える必要があります。
SenseTalkは、このような場合には、delimited by
というフレーズを使って、各チャンクに使用されるデリミタを指定することで、より簡単な代替手段を提供します:
add 1 to item 3 delimited by "," of item 5 delimited by tab \
of line 18 of file complexDataFile
同じ構文は、line
のチャンクにも使用することができます:
get line 6 delimited by creturn of oddLineBreakText
テキストアイテムと行を区切るデリミタは単一の文字に限定されません:
put item 2 delimited by "<>" of "12<>A19<>X" -- A19
カスタムデリミタはword
チャンクにも許可されていますが、アイテムや行とは挙動が異なります。単語は通常、スペース、タブ、改行で区切られます。これらの“ホワイトスペース”文字は、二つの単語の間にいくつでも連続して現れることができます。単語チャンクのカスタムデリミタを指定すると、“単語”は、提供したデリミタ文字列に含まれる文字の任意の数と組み合わせによって区切られます:
put word 2 delimited by "<>" of "12><<>>A19><>X" -- A19
以下の例は、行チャンク(各デリミタ文字列が別々のチャンクとして扱われる)と単語チャンク(各デリミタ文字列が一つの単語ブレークとして扱われる)でのカスタムデリミタの使用の違いを説明するのに役立つかもしれません:
put each line delimited by ["<",">"] of "12><<>>A19><>X" -- ["12","","","","","A19","","","X"]
put each word delimited by "<>" of "12><<>>A19><>X" -- ["12","A19","X"]