チャンクの種類
チャンク式では、次のすべての種類のチャンクを扱うことができます。
種類 | 定義 |
---|---|
文字 | テキスト内にある個々の文字 |
単語 | テキスト内にある、任意の数の空白(スペース、タブ、リターン)で区切られた単語 |
行 | 複数ある標準的な改行文字(CR、LF、CRLFなど)のいずれかで区切られた段落 |
テキストアイテム | コンマで区切られたテキストの部分 |
リストアイテム | リスト内の個々のアイテム |
バイト | バイナリデータ内のバイト |
オカレンス(実際値) | 定義したパターンのテキストマッチ |
マッチ | 定義したパターンのテキストマッチおよびテキスト範囲 |
また、テキストアイテム、行、単語の識別に使用されるカスタムデリミタを指定して、機能を拡張することが可能です。 これら3種類のテキストチャンクが持つデリミタの種類はそれぞれ異なります。テキストアイテムは単一のテキスト文字列によって区切られ、行はテキスト文字列リストのうちのいずれかによって区切られ、単語は文字集合からの任意の数と組み合わせの文字によって区切られます。
文字
文字チャンクは、最もシンプルな種類のチャンクです。 文字は、単にテキストの1字のことで、目に見える文字も目に見えない文字も含まれます(目に見えない文字としては、タブ、キャリッジリターン、ラインフィード文字などの制御文字があります)。 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
単語
1単語の定義は、空白文字を含まない連続した文字または引用符に囲まれている連続した文字です。 単語の範囲の場合、含まれるのは、指定された最初の単語から指定された最後の単語までの、間に入るすべての単語と空白を含んだ全文字です。 空白文字としては、スペース、タブ、リターン(ニューライン)があります。
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
なお、引用フレーズは通常、引用符も含めて1単語として扱われます。
put <<Mary said "Good day" to John.>> into sentence
put the third word of sentence --> "Good day"
関連するローカルプロパティとグローバルプロパティ
SenseTalkには、チャンクにおける単語の扱いに関する側面を管理できるローカルプロパティとグローバルプロパティがあります。 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
関連するローカルプロパティとグローバルプロパティ
SenseTalkには、チャンクにおける行の扱いに関する側面を管理できるプロパティが2つあります。 the lineDelimiterローカルプロパティを設定すると、行を定義する改行文字(デリミタ文字列)の集合をデフォルトのもの以外に変更することができます。 the lineDelimiterをemptyに設定すると、デフォルト値のリストが返されます。
行デリミタのデフォルト集合を定義するのは、the defaultLineDelimiterグローバルプロパティです。 このプロパティは、初期設定ではCRLF、Return、CarriageReturn、LineSeparator、ParagraphSeparatorになっています。
これらのプロパティの定義は、チャンク式向けのローカルプロパティとグローバルプロパティをご覧ください。
テキストアイテム
テキスト内のアイテムは、通常、コンマとコンマの間にあるテキストの部分として定義されています。
put "A man, a plan, a canal. Panama!"into palindrome
put item 2 of palindrome --> " a plan"
the itemDelimiterプロパティを設定すると、区切り(デリミタ)文字にコンマ以外のものを指定することができます。 the itemDelimiterのデフォルト値は、the defaultItemDelimiterグローバルプロパティが決定します。 これらのプロパティの定義は、チャンク式向けのローカルプロパティとグローバルプロパティをご覧ください。
リストアイテム
itemsという語は、リスト内の要素を参照するときにも使えます。
put ("red", "green", "blue") into colors
put item 2 of colors --> green
put 1 into myText --> 1
put 2 into item 2 of myText --> 1,2
上記のコードでは、中央の文字をitemDelimiterとした、テキスト文字列が生成されます(itemDelimiterがemptyに設定されている場合を除く)。 テキストではなくリストを生成するには、次のようにlist itemを指定します。
put 1 into myList -- 1
put 2 into list item 2 of myList -- (1,2)
リストの扱い方についての詳細は、 リストおよびプロパティリストをご覧ください。
バイト
byteチャンクは、バイナリデータの一部を参照するときに使えます。
put <3f924618> into binaryData
put byte 2 of binaryData into b2 -- 92
byteチャンクについての詳細は、バイナリデータ操作 をご覧ください。
オカレンス(実際値)
occurrenceおよびoccurrencesを使うと、文字列のチャンクとしてパターンにアクセスすることができ、一致した最初の文字の位置が返されます。 文字列内の特定の単一パターンオカレンスにアクセスするときはoccurrenceを、オカレンスの範囲を返すときはoccurrencesを使用します。
occurrenceのシノニムとしてinstanceを、occurrencesの代わりとしてinstancesを、いつでも使用することができます。
put occurrence 4 of <digit> in "V2.7 for 4/3/18" --> 3
オカレンスの範囲をリクエストすると、元の文字列の部分文字列ではなく、値のリストが返されます。
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キーワードを使うと、文字列のチャンクとしてパターンにアクセスすることができます。 値として返されるのは、一致のフルテキストを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パターン言語の基本をご覧ください。
カスタムチャンク
標準のword、lineおよびtext itemチャンクはそのままでも大いに有用ですが、 特定の形式のテキストを他のやり方で区切りたい場合もあるかもしれません。 例えば、ファイルの各行で複数の値がタブ文字によって区切られているデータファイルは、多くのプログラムで生成される可能性があります。
こうしたデータを扱うとき、1つには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
テキストアイテムや行を区切るためのデリミタは、1文字に制限されているわけではありません。
put item 2 delimited by "<>" of "12<>A19<>X" --> A19
カスタムデリミタは、wordチャンクでも使うことができますが、その振る舞いはアイテムや行のときとは異なります。 単語は通常、スペースやタブ、ラインブレークによって区切られます。 2つの単語の間には、こうした「空白」文字が連続していくつあっても構いません。 wordチャンクにカスタムデリミタを指定すると、指定したデリミタ文字列に含まれている任意の数および組み合わせの文字によって「単語」が区切られることになります。
put word 2 delimited by "<>" of "12><<>>A19><>X" --> A19
カスタムデリミタ使用時における行チャンク(検出されたデリミタ文字列の1つ1つが個別のチャンクとして扱われる)と単語チャンク(連続したデリミタ文字列が単一の単語区切りとして扱われる)の違いについては、次の例が分かりやすいかもしれません。
put each line delimited by ("<",">") of "12><<>>A19><>X" --> (12,,,,,A19,,,X)
put each word delimited by "<>" of "12><<>>A19><>X" --> (12,A19,X)
of line 18 of file complexDataFile
同じ構文は、次のようにlineチャンクでも使用することができます。
get line 6 delimited by creturn of oddLineBreakText
テキストアイテムや行を区切るためのデリミタは、1文字に制限されているわけではありません。
put item 2 delimited by "<>" of "12<>A19<>X" --> A19
カスタムデリミタは、wordチャンクでも使うことができますが、その振る舞いはアイテムや行のときとは異なります。 単語は通常、スペースやタブ、ラインブレークによって区切られます。 2つの単語の間には、こうした「空白」文字が連続していくつあっても構いません。 wordチャンクにカスタムデリミタを指定すると、指定したデリミタ文字列に含まれている任意の数および組み合わせの文字によって「単語」が区切られることになります。
put word 2 delimited by "<>" of "12><<>>A19><>X" --> A19
The following example may help to illustrate the difference between the use of custom delimiters for line chunks (which treat each delimiter string found as a separate chunk) and for word chunks (which treat each sequence of delimiter characters as a single word break):
put each line delimited by ("<",">") of "12><<>>A19><>X" --> (12,,,,,A19,,,X)
put each word delimited by "<>" of "12><<>>A19><>X" --> (12,A19,X)