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

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

データは固定フィールドで保存されている場合があります。patTabpatRTabpatLenpatPospatRPos関数を使用すれば、固定フィールドの文字列を簡単に抽出できます。patTabpatRTabは、文字列の左右の端から数えて何番目なのかを引数に取ります。指定のタブ位置までの文字列とマッチします。
例:

p = patPos(10) + patTab(15);

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

p = patPos(0) + patRTab(0);

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

patMatch( "now is the time", patLen(15) + patRPos(0), NULL, ANCHOR );

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

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

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

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

p = "<" + expr(p) + "*" + expr(p) + ">" | "x";
Pat Match( "<<x*<x*x>>*x>", patPos(0) + p + patRPos(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).