Matcher (クラス)
public final Matcher
パッケージ: CURL.LANGUAGE.REGEXP

コンパイル済みの正規表現のクラス。

説明

コンパイル済みの正規表現には、繰り返して使う正規表現が用意されています。コンパイル済みの正規表現を使用すると、regexp-match? などのプロシージャを使用した場合に比べて比較処理の速度が向上します。同じ正規表現を使って多数の文字列をマッチする場合、このクラスのインスタンスを作成することを推奨します。


{import * from CURL.LANGUAGE.REGEXP}
{value
    let m:Matcher = {Matcher "(foo\|bar)+"}
    {if {m.match "foobarbarfoo"} != null then
        {text "YES"}
     else
        {text "NO"}
    }
}


{import * from CURL.LANGUAGE.REGEXP}

{value
    let out:TextFlowBox = {TextFlowBox}
    let m:Matcher = {Matcher "foo", case-sensitive?=false}
    let result:#MatchState = {m.match "hello Foo goodbye"}
    {if result == null then
        {out.add {text No match occurred}}
     else
        {out.add {text {value result["match"]}}}
    }
    out
}

コンストラクタ
default:Matcher のインスタンスを新規に作成します。
コンストラクタ public {Matcher.default
regexp:StringInterface,
single-line?:bool = false,
multiline?:bool = false,
case-sensitive?:bool = true,
backwards?:bool = false,
partial?:bool = false
}

プロパティ
backref-count:\1 形式の逆方向参照を使って参照可能な正規表現のカウント。
アクセサ public final inline Matcher.backref-count:int
backwards?:検索を末尾から開始するかどうかを示します。
フィールド public constant Matcher.backwards?:bool
case-sensitive?:検索でケースを識別するかどうかを示します。
フィールド public constant Matcher.case-sensitive?:bool
multiline?:一致する文字列が複数行と見なされるかどうかを示します。
フィールド public constant Matcher.multiline?:bool
partial?:部分マッチが有効であるかどうかを示します。
フィールド public constant Matcher.partial?:bool
regexp:この matcher のイニシャライザに使用される正規表現。
フィールド public constant Matcher.regexp:StringInterface
single-line?:「.」が改行文字と一致するかどうかを示します。
フィールド public constant Matcher.single-line?:bool

メソッド
get-backref-for-name:指定された後方参照の参照番号を返します。
public final {Matcher.get-backref-for-name name:String}:int
get-name-for-backref:後方参照の名前を返します。
public final {Matcher.get-name-for-backref ref:int}:#String
match:コンパイル済み正規表現を文字列とマッチします。
public final {Matcher.match
str:StringInterface,
state:#MatchState = null,
start:int = 0
}:#MatchState
new-state:後続の Matcher.match の呼び出しの中で使う MatchState 構造体を新規に作成します。
public final inline {Matcher.new-state}:MatchState
メソッド 継承 Object: object-describe, object-describe-for-debugging, object-serialize



コンストラクタ詳細
default (コンストラクタ)
public {Matcher.default
regexp:StringInterface,
single-line?:bool = false,
multiline?:bool = false,
case-sensitive?:bool = true,
backwards?:bool = false,
partial?:bool = false
}

Matcher のインスタンスを新規に作成します。

regexp: コンパイルされる正規表現を含む StringInterface。作成後に regexp 属性として利用可能です。
backwards?: ターゲット文字列を前方検索するか後方検索するかを制御する関連する属性を設定します。詳細については、Matcher.backwards? を参照してください。
case-sensitive?: 大文字と小文字を区別するかどうかを制御する関連する属性を設定します。詳細については、Matcher.case-sensitive? を参照してください。
multiline?: 「^」および「$」アンカーの処理を制御する対応する属性を設定します。詳細については、Matcher.multiline? を参照してください。
single-line?: 「.」が改行文字と一致するかどうかを制御する対応する属性を設定します。詳細については、Matcher.single-line? を参照してください。
partial?: 部分マッチが有効かどうかを制御する対応する属性を設定します。逆方向の部分マッチはサポートされていないため、partial?backwards? を両方とも true に設定することはできません。詳細については、「Matcher.partial?」を参照してください。

例外のスロー

regexp 文字列が有効な正規表現を含んでいない場合に例外をスローします。



プロパティ詳細
backref-count (アクセサ)
アクセサ public final inline Matcher.backref-count:int

\1 形式の逆方向参照を使って参照可能な正規表現のカウント。



backwards? (フィールド)
public constant Matcher.backwards?:bool

検索を末尾から開始するかどうかを示します。

説明

正規表現を使った検索を文字列の先頭と末尾のどちらから開始するかを示します。true の値は、検索が末尾から開始されることを意味します。false の既定値は、検索が先頭から開始されることを意味します。
これは Matcher.match に対する start パラメータにも影響します。


case-sensitive? (フィールド)
public constant Matcher.case-sensitive?:bool

検索でケースを識別するかどうかを示します。

説明

文字列に対し式を検索する場合に、大文字と小文字を区別するかどうかを示します。false の値の場合、検索では一致を評価する際に大文字と小文字を区別しません。既定値は true です。


multiline? (フィールド)
public constant Matcher.multiline?:bool

一致する文字列が複数行と見なされるかどうかを示します。

説明

「^」アンカーおよび「$」アンカーを使って複数行にまたがる文字列を一致させるかどうかを示します。このオプションを false に設定した場合、たとえば "^foo" という正規表現を指定しても、"fie foo fum" という文字列はマッチしません。これは、改行文字の後ろにある文字列は次の行の先頭に位置すると見なされないためです。この場合、正規表現中で「^」の代わりに改行文字を指定する必要があります。一方、multiline? を true に設定した場合、"fie foo fum" という文字列はマッチします。このオプションの既定値は false です。


partial? (フィールド)
public constant Matcher.partial?:bool

部分マッチが有効であるかどうかを示します。

説明

部分マッチが有効であるかどうかを示します。
部分マッチでは、入力で適切な文字が続いていれば、その先頭から正規表現にマッチする最長の文字列が検出されます。これは、入力検証に最もよく用いられるもので、"それまでの" 入力が正しいものであることを検証するため、または最初の無効文字を検出するために使用できます。
部分マッチは前方から後方へのみサポートされます。
部分マッチを有効にすると、match メソッドの動作が次のように変更されます。
  • match メソッドは、入力が正規表現に完全マッチしなくても、常に NULL でない MatchState を返します。
  • 検索は、match への start キーワード引数によって指定された開始位置に暗黙的に固定されます。部分マッチまたは完全マッチは、この位置で始まる必要があります。開始位置 0 の場合、これは、正規表現の開始位置で '\A' アンカーを使用することと同じです。
  • 完全マッチがあると、名前 "match" を持つ MatchState.get または MatchState.get-range を使用して通常取得するように取得できます。マッチがないと、それぞれ NULL または (-1, 0) を返します。
  • 部分マッチに関する情報は、名前 "partial" を持つ get または get-range メソッドを使用して取得でき、この情報により、Matcher で部分マッチが有効になっていると、そのメソッドに応じて NULL でない文字列または有効な範囲が必ず作成されます。部分マッチの開始点は、match メソッドへの start キーワードの値と同じです。部分マッチの長さは、0 から文字列の長さまでとすることができますが、少なくとも完全マッチの長さが必要です。

正規表現の部分的マッチを使用して Visa クレジットカード番号の不正なエントリに関する即時フィードバックを提供する方法を示す小さな例が以下にあります。入力が正規表現に部分的にマッチしている間は、テキストの色は黒のままですが、番号が完全マッチすると緑に変わり、間違った文字が入力されると赤に変わります。

例: 部分マッチを使用した Visa クレジットカードの入力
{import * from CURL.LANGUAGE.REGEXP}
{let visa-regexp:Matcher =
    {Matcher |"4\d{3}(?: ?\d{4}){3}"|, partial? = true}
}
Visa #:
{TextField
    {on ValueChanged at tf:TextField do
        {if-non-null state = {visa-regexp.match tf.value} then
            let (i:int, partial:int) = {state.get-range "partial"}
            let (j:int, full:int) = {state.get-range "match"}
            {if full == tf.value.size then
                set tf.color = "green"
             elseif partial == tf.value.size then
                set tf.color = "black"
             else
                set tf.color = "red"
            }
        }
    }
} 


regexp (フィールド)
public constant Matcher.regexp:StringInterface

この matcher のイニシャライザに使用される正規表現。



single-line? (フィールド)
public constant Matcher.single-line?:bool

「.」が改行文字と一致するかどうかを示します。

説明

正規表現の「.」が改行と一致させるかどうかを示します。このオプションを false に設定した場合、たとえば "fo.bar" という正規表現を指定しても、"fo bar" という文字列にはマッチしません。「.」は改行文字と一致しないからです。一方、single-line?true に設定した場合、"fo bar" という文字列はマッチします。このオプションの既定値は false です。





メソッド詳細
get-backref-for-name (メソッド)
public final {Matcher.get-backref-for-name name:String}:int

指定された後方参照の参照番号を返します。

説明

指定された名前に対応する後方参照の番号を返します。 正規表現には、(?P<{param name}>regexp) 形式の名前を使い、名前つきの部分文字列グループの表現を含める必要があります。
指定された名前に関連する参照がない場合は -1 を返します。


{import * from CURL.LANGUAGE.REGEXP}

{let matcher:Matcher = {Matcher |"(?P\d\d):(?P\d\d)"|}}
{matcher.get-backref-for-name "hour"}


get-name-for-backref (メソッド)
public final {Matcher.get-name-for-backref ref:int}:#String

後方参照の名前を返します。

説明

後方参照で、番号 ref に対応する名前が存在する場合はこれを返します。 後方参照で名前が存在するのは、正規表現に (?P<name>regexp) 形式で名前つきの部分文字列グループ表現が含まれている場合のみです。
ref に関連する名前がない場合は null を返します。


{import * from CURL.LANGUAGE.REGEXP}

{let matcher:Matcher = {Matcher |"(?P\d\d):(?P\d\d)"|}}
{matcher.get-name-for-backref 1}


match (メソッド)
public final {Matcher.match
str:StringInterface,
state:#MatchState = null,
start:int = 0
}:#MatchState

コンパイル済み正規表現を文字列とマッチします。

str: 正規表現に対してマッチされる文字列。
state: このパラメータが NULL (既定値) である場合、このマッチに対して新規の MatchState 構造体が割り当てられます。このパラメータが NULL でない場合は、このパラメータの値が使われます。これにより、複数のマッチに対して同じ MatchState 構造体を再使用できるので、メモリをその都度割り当てる必要がなくなります。

MatchState は、Matcher.match または Matcher.new-state を呼び出すことによって作成できます。ただし、特定の MatchState は、その MatchState を作成した Matcher と組み合わせた形でしか使用できません。
start: 文字列内における検索開始位置。通常、この既定値はゼロ (文字列の先頭) で、マッチングはそこから文字列の末尾まで進められます。ただし、逆方向の Matcher の場合、既定値は str.size (文字列の末尾) で、マッチングはそこから文字列の先頭まで逆方向に進められます。逆方向マッチングに関する詳細については、Matcher.default を参照してください。

戻り値

マッチ結果を含む MatchState を返します。正規表現とマッチする文字列が存在しない場合は、null を返します。

プログラミング注意事項

マッチする文字列が存在する場合、返された MatchState を使って、元の正規表現のキャプチャされた (かっこでくくられた) 部分の最終的な値、および、特別なキャプチャである "prematch""match"、および "postmatch" を取得できます。
Matcherpartial? を true に設定すると、完全マッチがなくても、NULL でない MatchState が常に返され、 部分マッチの範囲を含む特別なキャプチャ "partial" が定義されます。詳細については、「Matcher.partial?」を参照してください。

{do
    let m1:Matcher = {Matcher "foo.*bar"}
    let m2:Matcher = {Matcher "foo.*?bar"}
    let str:String = "The food is behind the bar in the barn."
    let result1:MatchState = {m1.match str}
    let result2:MatchState = {m2.match str}
    {unless result1 == null do
        {output result1["match"]}
    }
    {unless result2 == null do
        {output result2["match"]}
    }
}

{do
    let m:Matcher = {Matcher "<(.*)>"}
    let result:MatchState =
        {m.match "Just a little < test > of regexps"}
    {unless result == null do
        {output "Before: ", result["prematch"]}
        {output "Inside: ", result[1]}
        {output "After: ", result["postmatch"]}
    }
}


new-state (メソッド)
public final inline {Matcher.new-state}:MatchState

後続の Matcher.match の呼び出しの中で使う MatchState 構造体を新規に作成します。