メインコンテンツまでスキップ

SenseTalkパターン言語の要素

SenseTalkのパターン言語を使用すると、テキスト内の文字列と一致するパターンを定義できます。SenseTalkパターン言語の基礎で説明されているように、パターンマッチング機能は正規表現(regex)をベースに構築されています。SenseTalkパターン言語を使用すると、読みやすい構文でパターンを定義できます。

任意の3つの数字の出現のような単純なパターンのためのパターン定義を作成することもできます。また、任意の長さを持つことができ、オプションの部分や代替の部分を持つ複雑なパターンのためのパターンを定義することもできます。どんなに単純であれ複雑であれ、すべてのパターンは基本的なパターン要素から構成されています。

パターン言語の構文

SenseTalkパターン言語におけるパターン定義は、角括弧(< ... >)で囲まれたパターンの説明から成ります。

文法:
{pattern} < patternLanguageExpression >

patternという単語はパターン言語ではオプションで、通常は省略されます。

パターン定義 - 上記の構文で_patternLanguageExpression_によって表される - は、7桁の数字を探すための7 digitsのような単一の要素であることができます。しかし、ほとんどのパターンは、要素のシーケンス、または_subpatterns_を含みます。シーケンスは、各サブパターンをカンマで区切る、thenで区切る、または各要素を新しい行にリストアップすることで指定します(またはこれらのオプションの組み合わせ)。

したがって、以下の例はすべて、社会保障番号のパターン定義を表現する同等の方法です:

<3 digits, "-", 2 digits, "-", 4 digits> <3 digits then "-"

set ssn to <3 digits, "-", 2 digits, "-", 4 digits>

set ssn to <3 digits then "-"
2 digits, "-",
2 digits, "-",then 4 digits>

サブパターンで代替選択を指定するためにorという単語を使用できます。例えば、

<"cat" or "cow">

は、catまたはcowのいずれかと一致します。

必要に応じて、要素をグループ化するために括弧を使用できます。例えば、

<"cat" or "cow" then 2 digits>

は、cat24cow17のようなテキストと一致します。しかし、

<"cat" or ("cow" then 2 digits)>

は、cat(数字は不要)またはcow97のようなものと一致します。

パターン要素

パターン定義は、個々の要素、またはサブパターンから構成されます。要素は"cat"のような引用符で囲まれた文字列に含まれる文字であることができます。また、SenseTalk変数、括弧内の表現、または以下のパターン定義要素表で説明されているいくつかのパターン要素のいずれかであることもできます。

要素が定義できる方法については、以下を注意してください:

  • ほとんどのパターン要素は単数または複数であることができます。
    • 単数要素は、指定された値のうちの正確に1つと一致します。
    • 複数要素は、指定された値の1つ以上の連続したものと一致します。
  • 量詞を使用して、要素が一致させたい文字や値の数を明示的に制御できます。

パターン定義要素

要素定義
"quoted string"正確な文字列を使用します
variable変数に格納されている任意の有効な要素や要素の組み合わせを使用します
expression
パターンの例: () (w) ( ) (7) (.) ())任意の文字に一致します
letter

letters
nonletter

nonletters
lowercase letter

lowercase letters
nonlowercase letter

nonlowercase letters
一致するパターン例: (w) ( ) (7) (.) ())任意の言語の大文字に一致します
マッチしない:() (w) ( ) (7) (.) ()) (salamander) otherStuff任意の言語の大文字以外の文字に一致します
digit

digits
0から9までの数字に一致します
nondigit

nondigits
letterOrDigit, alphanumeric

lettersOrDigits, alphanumerics
nonLetterOrDigit, nonAlphanumeric

nonLettersOrDigits, nonAlphanumerics
whitespace character

whitespace characters
nonwhitespace character

nonwhitespace characters
word character

word characters
単語の文字(文字または数字)に一致します
nonword character

nonword characters
punctuation character

punctuation characters
nonpunctuation character

nonpunctuation characters
句読点以外の文字に一致します
stk-syntax-definition.mdマッチするパターンの例:() (w) ( ) (7) (.) ()) (42) (salamander)
一致しない: () (w) ( ) (7) (.) ()) otherStuff{pattern} < patternLanguageExpression >
ノート

全てのケースでcharactercharcharacterscharsと省略することができます。

量詞と要素

単数形のパターン要素、例えばletterdigitを指定すると、そのタイプの要素が一つだけでパターンの一致が作成されます。複数形を指定すると、例えばlettersdigits、その要素が一つ以上あれば一致が作成されます。

また、要素がパターン一致を作成するために何回現れるべきかを指定するために使用できるいくつかの量詞があります。

ノート

次の説明では簡単さのためにcharacterという用語を使用しますが、任意の要素用語を使用することができます。

正確に一つの文字を意味する用語

character
a character
one character
exactly one character

例:

set myPattern to < "(" then a character then ")" >

以下のようなシーケンスにマッチします: (w) ( ) (7) (.) (()

マッチしません: () (42) (salamander) otherStuff

正確な数の文字を意味する用語

2 characters
exactly 2 characters
ノート

これらの例では数値2が示されていますが、任意の正の整数が使用できます。値が整数の変数も使用できますが、この場合には"exactly"という言葉を使用しなければなりません。

例:

set myPattern to < "(" then 2 characters then ")" >

一致するパターン例: (42) (CO) (())

マッチしません: () (w) ( ) (7) (.) ()) (salamander) otherStuff

0または1文字を意味する用語

maybe character
maybe a character
maybe one character
zero or one character
zero or maybe one character

例:

set myPattern to < "(" then maybe a character then ")" >

以下のようなシーケンスにマッチします: () (w) ( ) (7) (.)

マッチしません: (42) (salamander) otherStuff

ノート

このパターンは()))も一致することができますが、3つの文字すべてに一致する必要がある場合を除いて、()だけに一致することを優先します。

1文字以上を意味する用語

characters
some characters
one or more characters

例:

set myPattern to < "(" then characters then ")" >

以下のようなシーケンスにマッチします: (w) ( ) (7) (.) ()) (42) (salamander)

マッチしない:() otherStuff

以下の文下の例では、2つの文字列を一致します: (a woman)(her cat)

0文字以上を意味する用語

maybe characters
maybe some characters
zero or more characters

例:

set myPattern to < "(" then zero or more characters then ")" >

以下のようなシーケンスにマッチします: () (w) ( ) (7) (.) (42) (salamander)

一致しない: () otherStuff

ノート

このパターンは()))も一致することができますが、特定のコンテキストで3つの文字すべてに一致する必要がある場合を除いて、()だけに一致することを優先します。

以下の文下の例では、2つの文字列を一致します: (a woman)(her cat)

最小文字数を指定する用語

at least 2 characters
2 or more characters
2 or maybe more characters
at least 2 or more characters
at least 2 and maybe more characters
ノート

これらの例では数値2が示されていますが、任意の正の整数が使用できます。特定の数値の代わりに整数の値を持つ変数も使用できます。

例:

set myPattern to < "(" then 2 or morecharacters then ")" >

以下のようなシーケンスにマッチします: (42) (salamander)

マッチしません: () (w) ( ) (7) (.) ()) otherStuff

以下の文下の例では、2つの文字列を一致します: (a woman)(her cat)

最小文字数と最大文字数を指定する用語

2 to 4 characters
from 2 to 4 characters
ノート

これらの例では範囲が2から4まで示されていますが、任意の範囲の正の整数が使用できます。値が整数の変数も、数値の代わりに使用できます。

例:

set myPattern to < "(" then 2 to 4 characters then ")" >

一致するパターン例: (42)

マッチしません: () (w) ( ) (7) (.) ()) (salamander) otherStuff

Lazy vs. Greedy Quantifiers

ある数値の範囲にマッチするパターンを作成するとき、マッチは lazy または greedy になります。lazyサブパターンは全体のパターンにマッチする最小限の回数をマッチします。greedyサブパターンは可能な限り多くの回数をマッチします。

SenseTalkでは、パターンマッチングはデフォルトでlazyです。したがって、以下のパターン

< "(" , characters , ")" >

最初に出現する ')' を含む、一つ以上の文字で始まる '(' と一致するシーケンスをマッチします。パターンは

< "(" , lots of characters , ")" >

一方、ソーステキスト中の最終的な ')' を含む、できるだけ多くの文字を貪欲に消費する '(' で始まるシーケンスをマッチします。

例文

その違いを示すために、この例文を考えてみてください:

Amy (a woman) and Flossie (her cat) lie down to take a nap.

そして、このパターン:

< "(" then one or more characters then ")" >

例文が変数 myText に読み込まれていると仮定して、次のコードは二つの値を返します:

set myPattern to < "(" then one or more characters then ")" >
put every occurrence of myPattern in myText into myList
put mylist

出力: ((a woman),(her cat))

このように機能するのは、SenseTalkの one or more characterslazy — パターンを満たすために必要な最小限の文字を消費するためです。

しかし、場合によっては greedy マッチを作成する必要があります。この例では、以下のようにパターンを変更することで貪欲な挙動を実現できます:

< "(" then one or preferably more characters then ")" >

可能な場合はパターンがより多くの文字に一致することを指定すると、every occurrence of myPattern in myText の表現は、最初の '(' から最後の ')' までの全てを含む一つの値を返すようになります:

(a woman) and Flossie (her cat)

0または1文字を意味し、できれば1文字を好む項目

preferably character
preferably a character
preferably one character
zero or preferably one character

例:

set myPattern to < "(" then preferably a character then ")" >

以下のようなシーケンスにマッチします: () (w) ( ) (7) (.) ())

マッチしません: (42) (salamander) otherStuff

ノート

パターンが (())) に遭遇すると、後半のパターンを満たすために2番目の ')' が必要な状況でない限り、すべての3文字に貪欲にマッチします。そうでなければ () のみにマッチします。

1つ以上の文字を意味し、可能な限り多くを好む項目:

lots of characters
preferably lots of characters
one orlots of characters
one or preferably lots of characters
one or preferably more characters

例:

set myPattern to < "(" then lots of characters then ")" >

以下のようなシーケンスにマッチします: (w) ( ) (7) (.) ()) (42) (salamander)

マッチしない:() (w) ( ) (7) (.) ()) otherStuff

上述の文(例)では、次の一つの文字列に一致します:(a woman) and Flossie (her cat)

0文字以上を意味し、可能な限り多くを好む項目

preferably characters
maybe lots of characters
zero or lots of characters
zero or preferably lots of characters
zero or preferably more characters

例:

set myPattern to < "(" then zero or preferably more characters then ")" >

以下のようなシーケンスにマッチします: () (w) ( ) (7) (.) ()) (42) (salamander)

一致しない: otherStuff

ノート

検索が (())) に遭遇すると、このパターンは2番目の ')' が後半のパターンを満たすために必要な状況でない限り、すべての3文字に貪欲にマッチします。そうでなければ () のみにマッチします。

上述の文(例)では、次の一つの文字列に一致します:(a woman) and Flossie (her cat)

最小限の文字数を指定し、可能な限り多くを好む項目

少なくとも2文字、できれば多くの文字
2文字または多くの文字
2文字、できれば多くの文字
2文字、できれば多くの文字
少なくとも2文字、できれば多くの文字
少なくとも2文字、できれば多くの文字

これらの例では2という数字が示されていますが、任意の正の整数を使用することができます。

例:

set myPattern to < "(" then 2 or preferably more characters then ")" >

以下のようなシーケンスにマッチします: (42) (salamander)

マッチしません: () (w) ( ) (7) (.) ()) otherStuff

上述の文(例)では、以下に一致します:(a woman) and Flossie (her cat)

最小限と最大限の文字数を指定し、可能な限り多くを好む項目

2から4文字、できるだけ貪欲に
2から4文字、できるだけ貪欲に

これらの例では、2から4という範囲が示されていますが、任意の範囲の正の整数を使用することができます。

例:

set myPattern to < "(" then from 2 to 4 characters greedily then ")" >

一致するパターン例: (42) (salamander)

マッチしません: () (w) ( ) (7) (.) ()) (salamander) otherStuff

貪欲な振る舞いまたは怠惰な振る舞いを強制する

任意の文字数を表す項目の後にgreedilyまたはlazilyという項目を使用することで、貪欲な振る舞いまたは怠惰な振る舞いを明示的に強制することができます。これらの項目が使用されると、常に優先され、前の項目の通常の振る舞いに関係なく優先されます。

以下にいくつかの例を示します:

maybe a character greedily -- ゼロまたは一つ、だけど一つを好む
some characters greedily -- 一つ以上、だけどできるだけ多くを好む
lots of characters greedily -- 一つ以上、だけどできるだけ多くを好む(通常の振る舞いを明示したもの)
lots of characters lazily -- 一つ以上、だけどできるだけ少なくを好む(通常の振る舞う(通常の振る舞いをオーバーライド)

### 貪欲な同義語

指定する際にこれらの用語は互換性があります:

lots, lots of, many, max, maximum, the maximum number of, the most

マッチするパターンの例:(42)

SenseTalkのテキスト比較は通常、ケースセンシティブではない、と[Expressions](/studio/ja/stk-expressions#case-sense)で説明されています。この振る舞いはパターンマッチにも適用されます。したがって、あなたのパターンが文字を探すとき、大文字でも小文字でもマッチします。ケースセンシティビティを必要とするデフォルトの振る舞いを[the caseSensitive local property](/studio/ja/stk-global-properties-values#casesensitive)を使用して変更することができます。

ほとんどの比較演算子は、演算子のオプションとして直接指定することでケースセンシティビティを許可することもできますが、これはグローバル設定を上書きします。これらのオプションは、パターン比較だけでなく、通常のテキスト比較にも適用されます。以下の例で示します:

put <3 chars from "ABCDEF"> matches "fab" --> True
put <3 chars from "ABCDEF"> matches "fab" case sensitive --> False

パターン内のケースセンシティビティ設定

ケースセンシティビティの設定をパターン定義に直接組み込むことができます。これらのインライン設定は、常にデフォルトの設定やコマンドで指定されたオプションに優先します。パターン内でこれらのオプションを含めることで、パターンの異なる部分でのケースセンシティビティを細かく制御することができます。以上就是所有的翻译内容。如需继续,请提供更多的内容。

大文字小文字の区別要素の構文:

case sensitive -- パターンの後続のすべての要素は大文字と小文字を区別する必要があります
case insensitive -- パターンの後続のすべての要素は大文字と小文字を区別しない
case sensitive: element -- 指定された要素は大文字と小文字を区別する必要があります
case insensitive: element -- 指定された要素は大文字と小文字を区別しない
case sensitive: ( subPattern ) -- 指定されたサブパターンは大文字と小文字を区別する必要があります
case insensitive: ( subPattern ) -- 指定されたサブパターンは大文字と小文字を区別しない
ノート

case sensitiveが表示されている場所では、その同義語を使用することができます: case-sensitiveまたはcaseSensitiveまたはconsidering caseまたはwith case

case insensitiveが表示されている場所では、その同義語を使用することができます: case-insensitiveまたはcaseInsensitiveまたはignoring caseまたはwithout case

例:

put "abc" matches <case sensitive, 3 chars from "DCBA"> --> False

例:

set partNum to <"ABC", digit, case-sensitive: char in "JQXZ", digit>
put partNum matches "Abc9Q2" --> True ("ABC"は大文字と小文字を区別しない)
put partNum matches "ABC7x3" --> False ("x"は大文字になっていない)

例:

set code to <with case, character of "ABC", ignoring case, character of "XYZ">
put "aZ" matches code --> False ("a"はマッチするために大文字でなければならない)
put "Bx" matches code --> True ("x"は大文字または小文字であることができる)
ノート

大文字小文字の区別指示子は、存在する場合、実質的にはパターン定義自体の一部ではなく、むしろそれが適用される全体の定義に影響を与えます。したがって、大文字小文字の区別値を指定すると、ソーステキストからパターンのマッチングのための文字を消費しない。