1. ホーム
  2. regex

[解決済み] Regexの複数マッチの部分文字列

2022-03-01 22:30:36

質問

私は、Perlの正規表現が与えられたときに、ドロップダウンメニューと単純な入力フィールドのどちらを表示すべきかを判断するアプリケーションを持っています。したがって、私は"outer form"とサブストリングのための正規表現パターンをチェックする必要があります。このために、私はいくつかの解決策を思いつきました。

入力パターンが "^(100|500|1000)$" である場合、100、500、1000 の 3 つの項目を持つドロップダウンメニューになるはずです。有効なリストかどうかを判断するためにパターン全体を解析する正規表現と、1つの部分文字列を複数回マッチさせる方法を知らないので、実際の部分文字列のマッチングを行う正規表現が必要です。これが私の正規表現パターンです。

^\^\((?:((?:[^\|]|\\\|)+)(?:\||(?:\)\$$)))+

この正規表現は少し曖昧なので、少し簡略化します。

^\^\((?:([\w\d]+)(?:\||(?:\)\$$)))+

これは動作しますが、PCREとオンラインの正規表現ツールでテストしたところ、最後の部分文字列(この例では1000)だけが保存され、残りは捨てられます。実際の部分文字列、つまりドロップダウンメニューのフィールドを取得するためには、次のような方法があります。

(?:\^\()?((?:[^\|]|\\|)+)(?:\||(?:\)\$$))

再び簡略化。

(?:\^\()?([\w\d]+)(?:\||(?:\)\$$))

これは部分文字列にはマッチしますが、他の正規表現が行うドロップダウンメニューのパターン構文にはマッチしません(例えば、この正規表現は部分文字列 "100" を持つ "^(100|") にもマッチします)。 質問は、これらの正規表現を組み合わせて、1) パターン構文全体と 2) 実際のサブストリングにマッチする 1 つのパターンを作成する方法はありますか?

よろしくお願いします。

ジェレミー

追伸:当たり前のことですが、今日は正規表現について少し混乱しています。

サンプルデータです。

入力正規表現。^(100|500|1000)$
シンタックスOK!
一致した部分文字列 100, 500, 1000
=> ドロップダウンメニューを表示する

正規表現を入力します。^[0-9a-fA-F]+$ と入力します。
構文が違う!
=> 通常の入力フィールドを表示する

正規表現を入力します。^(foo|bar)$」と入力します。
シンタックスOK!
一致した部分文字列: "foo"、"bar"。
=> ドロップダウンメニューを表示する

正規表現を入力します。^(foo|bar)[0-9]+$」と入力します。
構文が違う!
=> 通常の入力フィールドを表示する

解決方法は?

2つのステップを踏むことで、必要なことを実現することができます。

この正規表現を使用して、フォーマットの検証を行うことができます。

\^\(\w+(?:\|\w+)*\)\$

動作デモ

正しい文字列を検証したら、次のような関数を使うことができます。

$str = "^(100|500|1000|2000|3000)$";
$arr = preg_split ("/\W+/" , $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($arr);

出力します。

Array
(
    [0] => 100
    [1] => 500
    [2] => 1000
    [3] => 2000
    [4] => 3000
)