2016-06-28 17 views
1

を中期に一致するように、単一の正規表現を変更します。{=tokenstring[^{}]*(?:{[^{}]*}[^{}]*)*}/gマッチ適切にこの文字列この<em>は正規表現</em>また、文字列から

{=tokenstring?param1=11&param2={token-identifier}&param3={token-child-identifier}&param4=20} 

を(文字列が私の中で使用されているトークンであることコンテンツページの提供されたリクエストデータに基づいて動的に値が変更されます)

RegExにもう1つの条件を追加します。例えば「param3」、それは文字列に存在するかどう見つけます。

私はこの新しい正規表現知っている:/param3=([^&])/文字列から単語「param3」を取得しますが、元の正規表現にその新しい正規表現に合わせてどのように?

+1

あなたが正規表現でこれを行うことができるかもしれないが、あなたは最初に '&'ことで、その後、 '='で文字列を分割することができれば、あなたは大いに問題を単純化することができます。現在どのツール/言語を使用していますか? –

+0

あなたは 'param3'の値が欲しいのですか、それともparam3が存在しないかを確認したいのですか? – abc123

+0

1.私は、この正規表現ツール使用しています:param3は上記参照文字列に存在するかどうか確認したいhttp://regexr.com/ 2.を。 3. TIm:このRegExをデータベースクエリに使用する必要があるため、文字列の分割はここでは機能しません。 –

答えて

0

オンラインデバッガと暫定的な実験。前:

{=tokenstring[^{}]*(?:{[^{}]*}[^{}]*)*} 

Regular expression visualization

Debuggex Demo "before"

後:

{=tokenstring[^{}]*(?:{[^{}]*}[^{}]*)*param3=(?:{[^{}]*}[^{}]*)*} 

Regular expression visualization

Debuggex Demo "after"

+0

解決のためのagcありがとうございます。それは私のために働いた。 –

0

あなたはパラメータの固定数を持っていない場合、それはあなたがグループの動的な数の正規表現を作成することはできませんので、あなたは、単一の正規表現を書くことができないことを意味します。ただし、マッチを繰り返すことができます。 PHPの例では、この

#Check if token is right 
if (preg_match('/\A\{=tokenstring\?param.+\}\Z/s', $subject)) { 
    # Successful match. Now iterate over tokens and their params 
    preg_match_all('/(param\d+)=(.+?)(?:&|(?:\}$))/s', $subject, $result, PREG_SET_ORDER); 
    for ($matchi = 0; $matchi < count($result); $matchi++) { 
     $param = $result[$matchi][0]; 
     $param_value = $result[$matchi][1]; 
    } 
} else { 
    # Match attempt failed 
} 

UPDATEのようになります:1つのパラメータが欠落していることができたとき、私は単一の正規表現で行うことができます最高のケースである(つまり、3つのまたは4のパラメータをそこにいる)

あなたはパラメータが不足しているかを検出できるよう
{=tokenstring\?(?:(param\d+)=(.+?)(?:&|(?:}$)))(?:(param\d+)=(.+?)(?:&|(?:}$)))(?:(param\d+)=(.+?)(?:&|(?:}$)))|(?:(param\d+)=(.+?)(?:&|(?:}$))) 

あなたは試合グループにパラメータをマッチしますよ。また、パラメータの順序は関係ありません。

regexにif-then-else (?(?=condition)then|else)構造もありますが、1〜4個のパラメータを持つことができれば、3つのレベルのネストされた正規表現を作成する必要があります。 4つのパラメータ、3つのパラメータの存在の中のもう1つなど、それぞれが狂った数の捕捉グループで繰り返されます。

+0

返信ありがとうございますが、私はこのケースでは単一のRegExソリューションを探しています。これはMySqlレベルでこのソリューションを使用できないためです。もし私が単一のRegExソリューションを持っていれば、それはPHPとMySqlの両方で動作します。 –

+0

申し訳ありませんが、RegExは私のために働いていません。これは、参照文字列の例を扱っています。 また、>>改行時に$が一致することをサポートする必要がある場合、if symbolが文字列の終わりまたはパラメータの一部であるかどうかを検出する他の方法はありません<<現在のRegExはこの状況でうまく動作しますが、そうでないかチェックしていない。 –

+0

@AnkitShahええ、それは実際には動作しません、マッチンググループと混同しています。もう一度もう一度試してみるといいでしょうが、本当に有望に見えません。 – buld0zzr

関連する問題