-1

まず、私の質問はおそらくこれと重複する可能性があることを知っていますが、100%正確でなければならない解決策が必要です。そして、私はこれを達成するための正規表現があまり得意ではありません:)

のように渡されたパラメータが少ないmaaaaaaaaanyリクエストがあります...&params=key1=value1|key2=value2|...。パラメータが少ない可能性があり、順序がわかりません。私が必要としているのは、exactkey1=myValue1とを含むリクエストをキャッチkey2=myValue2することですが、次のようになります。

  • key1=myValue1|key2=myValue2
  • key2=myValue2|key1=myValue1
  • key1=myValue1|key3=myValue3|key2=myValue2

またはさらに複雑です。知られていること:

  • paramsリクエストの一部にすぎないため、?something=other&params=key1=value1|key2=value2または?params=key1=value1|key2=value2&something=other
  • パラメータ内paramsには白い文字はなく、key=value'のペア(で区切られている|)のみがあります

明確にするために:私はkey = valueの2つのペアを知っているので、正規表現はそれらの2つのペアを含む一致するリクエスト専用です。リクエストは別の方法で注文できます。自分自身をリクエストするためのアクセス権がありません。保存されたデータ(文字列として)のみを処理します。

正規表現が使用される言語はPHPです。しかし、Webアプリケーションインターフェイスで正規表現を宣言しているため、完全なコードにアクセスできません。

私は2つの前向きな先読みが必要だと思います(?=[^\s]*(key1=myValue1)[^\s]*){1}(?=[^\s]*(key2=myValue2)[^\s]*){1}が、それを機能させることができず、時計が刻々と過ぎています...

4

3 に答える 3

2

2つの先読みを使用します。

^(?=.*\bkey1=myValue1\b)(?=.*\bkey2=myValue2\b)

単語境界アンカーは\b、英数字の「単語」全体のみが一致することを確認します。

于 2012-08-08T13:10:37.907 に答える
1

これは、特定の問題に合わせて非常に細かく調整された正規表現です。 こちらのライブデモをご覧ください。

(?:^\?|&)params=(?:|[^&]*\|)([^=]+)=([^|&]*)(?=[^&]*\|\1=\2(?:[|&]|$))
|               |           |       |          |    | |    |
|               |           |       |          |    | |    Ensure the value
|               |           |       |          |    | |    is followed by a
|               |           |       |          |    | |    '|' or '&' or the
|               |           |       |          |    | |    end-of-string so
|               |           |       |          |    | |    as not to match
|               |           |       |          |    | |    a substring.
|               |           |       |          |    | |
|               |           |       |          |    | Use backreferences to
|               |           |       |          |    | refer to the preceding
|               |           |       |          |    | key/value pair found.
|               |           |       |          |    |
|               |           |       |          |    Logically it must be
|               |           |       |          |    true that the second
|               |           |       |          |    pair follows a '|'.
|               |           |       |          |
|               |           |       |          Keep searching for the
|               |           |       |          duplicate key/value pair as
|               |           |       |          long as we don't hit a '&'.
|               |           |       |
|               |           |       Consider all characters valid for a
|               |           |       value until we hit a '|' or '&'.  Also,
|               |           |       allow empty values (*).
|               |           |
|               |           Consider all characters valid for a key until we
|               |           hit a '='.  Therefore, expect having an odd
|               |           number of key/value entities to cause a problem.
|               |
|               Start searching immediately following the "params=" or after
|               a string of non-'&' characters followed by a '|'.
|
Start at the beginning of the string with a '?', or somewhere (anywhere) in
the string with a '&'.    

他のソリューションに対するその利点には、(部分文字列ではなく)完全なキーをより厳密に見つけること、そしてもちろん、後方参照を使用して特定のキーをまったく指定する必要がないことが含まれます。

ノート:

  1. デモの\r\nは、デモのみを目的としています。
  2. ルックアラウンドアサーション内でキャプチャすることはできません。したがって、最初のセットはルックアラウンドアサーションなしで一致します。
  3. value1=key1この正規表現は、が偶然に一致する可能性を防ぐものではありませんkey1=value1
于 2012-08-08T18:14:50.987 に答える
0

これは合いますか?

(key[\d]+=[^|]+)

選択した言語を知らなければ、それを使用してグループを抽出する方法を提供することはできません。

これは次のことを意味します。

Match "key" explicitly
Match any amount of numbers until you hit a non-number
Match "=" explicitly
Match any amount of characters that aren't a pipe "|"

これは、パイプ文字で区切られた任意の量のkey#=valueペアに一致します。

編集:あなたのコメントに応えて:

([A-Za-z\d]+=[^|]+)

これの意味は:

Match any amount of alphabetical characters or numbers
Match "=" explicitly
Match any character that is not a pipe character "|"

これは、次のいずれかに一致します。

key=value|myKey=MyValue|key2012=MyValue2012|country=usa|sex=female
于 2012-08-08T13:12:13.830 に答える