スクリプトガイド > データタイプ > パターンマッチ > 固定フィールドの文字列の解析
公開日: 11/25/2021

固定フィールドの文字列の解析

データは固定フィールドで保存されている場合があります。Pat Tab()Pat R Tab()Pat Len()Pat Pos()Pat R Pos()関数を使用すれば、固定フィールドの文字列を簡単に抽出できます。Pat Tab()Pat R Tab()は、文字列の左右の端から数えて何番目なのかを引数に取ります。指定のタブ位置までの文字列とマッチします。たとえば、次のような手順で要約できます。

p = Pat Pos(10) + Pat Tab(15);

Pat Pos(10)は、10の位置にあるヌル文字列とマッチします。そのためマッチしたときには、位置10までマッチングが勧められます。そして、次にPat Tab(15)が現在の位置(10)から位置15までテキストをマッチします。このパターンは、Pat Pos(10)+patLen(5)と等価です。次に、別の例を示します。

p = Pat Pos(0) + Pat R Tab(0);

この例は開始の0文字から終了の0文字まで、文字列全体をマッチさせます。Pat Rem()関数は、Pat R Tab(0)の省略形で「文字列の残り」を意味し、引数を取りません。パターンマッチングは、次のように文字列の最初にアンカーを設定することもできます。

Pat Match( "now is the time", Pat Len(15) + Pat R Pos(0), NULL, ANCHOR );

上の例では置換後の文字列ではなくNULLを使用し、オプションでANCHORを使用しています。両方とも大文字です。NULLは置き換えが行われないことを意味します。ANCHORはパターンマッチの開始位置が文字列の最初に固定されることを意味します。デフォルト値はUNANCHOREDです。

次に示すパターンは、再帰的ではありません

p = "a" | "b"; // 1文字をマッチさせます。
p = p + p; // 2文字
p = p + p; // 4文字
Pat Match( "babb", Pat Pos(0) + p + Pat R Pos(0) );

再帰的なパターンはexpr()を使って現在の定義を参照します。

p = "<" + Expr(p) + "*" + Expr(p) + ">" | "x";
Pat Match( "<<x*<x*x>>*x>", Pat Pos(0) + p + Pat R Pos(0) );

expr()はいわゆる「遅延」関数であり、1行目でpにパターンを割り当てる際には、expr(p)の引数(p)は評価されません。その次のステートメントではpatMatchによりパターンマッチが実行され、この時、expr()に遭遇するたびに引数の現在の値を参照します。この例では、マッチングの間の値は変化しません。pが自身によって定義されているなら、どのように処理されるのでしょうか。

pは2つの選択肢によって構成されます。右側の選択肢は簡単です。"x"一文字です。左側は少し難解で、<p*p>というパターンです。そして、<p*p>の各pは、"x"の1文字か、もしくは、<p*p>になっています。最後のいつくかの例では、パターンマッチがソーステキスト全体に対して行われるように、patPos(0) + ... + patRPos(0)を使用しています。テキスト全体にマッチングが必要な場合と、サブテキストだけにマッチングが必要な場合があります。ソーステキストを変更しながらこれらの例を試す場合は、テキスト全体へのマッチングを行った方が、何がマッチしたかを簡単に確認できるでしょう。Pat Matchの結果は0または1です。

次の例では「左の」再帰を使用しています。

x =  Expr(x) + "a" | "b"; // +は|よりも優先される

patMatch関数をFULLSCANモードで使用した場合、マッチングが進められていく際にメモリが使い果たされたり、再帰の階層が膨れ上がってしまう可能性があります。ただし、デフォルトではpatMatch関数はFULLSCANを使用せず、ある仮定に基づいて再帰を停止させ、マッチングを成功させます。FULLSCANモードで実行するには、patMatch関数の第4以降の引数にFULLSCANと指定します。先ほどの例のパターンは、「b」一文字か、「b」の後続がすべて「a」になっている文字列にマッチします。

rc = Pat Match( "baaaaa", x );
より詳細な情報が必要な場合や、質問があるときは、JMPユーザーコミュニティで答えを見つけましょう (community.jmp.com).