SenseTalkでパターンを使用する
SenseTalkパターン言語は、SenseTalkの自然言語構文でソーステキスト内のパターンを検索することができます。パターン言語の一般的な説明については、SenseTalkパターン言語の基礎を参照してください。パターンを定義する方法に関する完全な情報については、SenseTalkパターン言語の要素を参照してください。
以下に、SenseTalkスクリプトでパターンを使用する方法についての情報が記載されています。
パターンマッチングのためのオペレータ、コマンド、および関数
パターンは、大きな文字列内の特定のテキストの存在または位置を探すすべてのSenseTalkオペレータ、およびテキストを操作するコマンドや関数に対応しています。
set ssn to <3 digits then dash then 2 digits then dash then 4 digits>
put every offset of ssn in textblock into ssnList // Finds the offset (first character position) of all occurrences of ssn pattern match in textblock and places those positions into the ssnList list
以下のオペレータ、コマンド、および関数をパターン言語で使用できます。
contains
operatoris in
operatorbegins with
operatorends with
operatoroffset
,range
,every offset
,every range
functionsreplace
commanddelete
commandsplit
command,split by
functionnumber of occurrences of
function
さらに、パターンの使用に特化したオペレータと関数もあります。
Matches
オペレータ
matches
オペレータを使用して、変数または式がパターンと完全に一致するかどうかをテストします。オペランドの一つはパターンであり、もう一つは文字列値として扱われます。このオペレータは、パターンが文字列全体と完全に一致する場合にtrue
を返します。パタンが文字列の一部のみ、または全く一致しない場合、matches
オペレータの結果はfalse
となります。
例:
put 83 matches <digit,digit> --> True
put <"x", 3 chars, "y"> matches "xyzzy" --> True
パターンが全体の値と一致する可能性がある場合、matches
オペレータはtrue
を返します。たとえ、通常のパターンのマッチが全体の文字列を返さない場合でも(使用中の遅延量詞による):
put <"$", digits> matches "$895" --> True
put the occurrence of <"$", digits> in "$895" --> "$8"
遅延と貪欲なマッチおよび量詞についての情報は、**SenseTalkパターン言語の要素**を参照してください。
Match
およびEvery Match
関数
match
およびevery match
関数を使用して、テキスト内のパターンを特定します。match
関数は指定されたパターンの最初の出現を見つけ、every match
はソース内のパターンのすべての出現を見つけます。
match
関数がパターンに一致するものを見つけると、パターンによってはいくつかのプロパティを含むマッチプロパティリストを返します。基本的なパターンでは、プロパティリストには一致したテキストを示すtext
と、そのテキストが見つかった範囲を示すtext_range
が含まれます。
every match
関数は、プロパティリストのリストを返します。各プロパティリストは、match
関数と同じ情報を含みます。
例:
put the match of <3 digits> in "123456789" --> (text:"123", text_range:"1" to "3")
put every match of <3 digits> in "123456789" --> ((text:"123", text_range:"1" to "3"),(text:"456", text_range:"4" to "6"),(text:"789", text_range:"7" to "9"))
これらの関数についての詳細な情報については、**Pattern Matching Functions**を参照してください。
Occurrence
およびEvery Occurrence
関数
occurrence
およびevery occurrence
関数を使用して、定義されたパターンの一致するテキストを返します。occurrence
関数は最初に見つかった一致を返し、every occurrence
はソーステキスト内で見つかったすべての一致のリストを返します。
put the occurrence of <"(",chars,")"> in "sqrt(42)" --> "(42)"
put every occurrence of <3 digits> in "123456" --> (123,456)
これらの関数についての詳細な情報については、**Pattern Matching Functions**を参照してください。
パターン内の変数と式の使用
パターンを定義するときには、Pattern Elementsで説明されている要素を使用できます。ただし、時にはパターンが一つの使用から次の使用まで変化する要素を含ま なければならないことがあります。
例えば、15-Aug-2018
の形式の日付に一致する簡単な日付パターンを考えてみてください。次のパターンはそのような日付を見つけます:
set datePattern to <1 or 2 digits, "-", 3 letters, "-", 4 digits>
しかし、すべての日付を見つけたいのではなく、スクリプトの別の場所で決定される特定の月の日付だけを見つけたいとします。この場所では、パターンのその要素の代わりに変数を使用することができます。パターンはランタイムでの変数の値を使用して構築されます:
set month to "Oct"
set datePattern to <1 or 2 digits, "-", month, "-", 4 digits>
変数month
の値がパターンに代入されるため、パターンの有効な一致は10月の日付だけとなります。
以下は、monthName() functionを使用してmonth
変数を現在の月の名前に設定する類似の例です:
set month to the abbreviated monthName -- Use the current month for the pattern
set datePattern to <1 or 2 digits, "-", month, "-", 4 digits>
また、式を直接パターンに使用することもできるため、上記の例は次のように行うこともできます:
set datePattern to<1 or 2 digits, "-", the abbreviated monthName, "-", 4 digits>
より複雑な演算子を含む式は括弧で囲む必要があります 。前年の現在の月の日付を見つけるために、このパターンを使用することができます:
set datePattern to <1 or 2 digits, "-", the abbreviated monthName, "-", (the year -1)>
埋め込みパターン
パターンに特定の文字列を挿入する変数(例えば、「Oct」)に加えて、変数内でパターン定義を使用することができます。この機能により、大きなパターン定義の中にパターンを埋め込むことができます。この技術は、管理可能な部分で構築できる複雑なパターンの構築に役立ちます。
例えば、米国の電話番号を検索するパターンが必要な場合があります。米国の電話番号は、3桁の 市外局番と7桁の番号(3桁と4桁のグループに分割)で構成されています。市外局番は地元エリア内ではオプションで、桁のグループを区切る一般的な方法がいくつかあります。
この例では、以下のような電話番号に一致するパターンを構築します:
555-1212
(800) 123-4567
(123)654-1111
888-222-0987
まず、市外局番がどのように表示されるかの異なる方法を考え、それを部分に分けてみましょう:
set areaCodeParen to <"(", 3 digits, ")", maybe a space>
set areaCodeDash to <3 digits, "-">
これらのオプションのいずれかを許可したいので、or
を使用してareaCode
パターンを構築します:
set areaCode to <areaCodeParen or areaCodeDash>
最後に、localNumber
パターンを定義し、すべてをまとめます:
set localNumber to<3 digits, "-", 4 digits>
set phoneNumber to <maybe areaCode then localNumber>
このアプローチは、一度にすべてのパターンを定義する場合よりも、コードが読みやすく理解しやすくなります。一度にすべてのパターンを定義すると、次のようになります:
set phoneNumber to <maybe (("(", 3 digits, ")", maybe a space) or (3 digits, "-")), 3 digits, "-", 4 digits>