パターン定義とキャプチャグループの使用
SenseTalkのパターン言語でパターンを定義するとき、パターン定義はElements of the SenseTalk Pattern Languageで述べられているように、複数の要素、またはサブパターンから作成できます。サブパターンをマークするために、その周りに中括弧を使用します。
キャプチャグループは次の3つの有用な目的に使用できます:
以下の構文を使用して、パターン内の各キャプチャグループに名前を付けることができます:
{ name : subPattern }
キャプチャグループの名前は省略することもでき、その場合、デフォルトの名前(Group_1、Group_2など)が割り当てられます。
重要: パターン全体が常にプロパティ名text
を持つマッチプロパティリストで報告されるため、text
をキャプチャグループ名として使用しないでください。
情報のキャプチャ
キャプチャグループの使用は、パターンマッチに関する追加情報をキャプチャすることを可能にします。キャプチャグループは、全体的なパターンマッチが行われたときに、マッチプロパティリストの一部としてキャプチャグループの具体的なマッチテキストとマッチの範囲を返します。
match()
やeveryMatch()
関数、およびmatch
チャンク表現を使用するとき、SenseTalkはマッチした完全なテキストとそのテキストがマッチしたソース内の範囲を含むプロパティリストを返します。キャプチャグループを使用すると、マッチプロパティリストにはマッチした各キャプチャグループに対して2つの追加プロパティが含まれます:
- name: このプロパティにはキャプチャ グループの実際の名前が含まれ、値は一致したテキストです。
- name_range: グループ名に
_range
が追加されたプロパティと、グループが一致した文字の範囲を表す値。
これらの関数についての詳細情報は、Match()
, EveryMatch()
Functionsをご覧ください。
次の例は、キャプチャグループがないパターン定義を示しています:
set parenPattern to <"(" then some characters then ")">
put the match of parenPattern in "John Jacob (Jingleheimer) Smith"
この場合、parenPattern
は括弧で囲まれたテキストにマッチするシンプルなパターンです。その結果のマッチは次のとおりで す:
(text:"(Jingleheimer)", text_range:"12" to "25")
同じパターンは、キャプチャグループを使用して定義することも可能です:
set parenPattern to <"(" then {content: some characters} then ")">
put the match of parenPattern in "John Jacob (Jingleheimer) Smith"
ここでは、パターンのsome characters
部分が中括弧で囲まれ、グループ名content
でラベル付けされています。その結果のマッチは次のとおりです:
(content:"Jingleheimer", content_range:"13" to "24", text:"(Jingleheimer)", text_range:"12" to "25")
text
とtext_range