-1

首先,我知道我的问题可能与这个问题重复,但我需要的解决方案必须 100% 正确。而且我不太擅长正则表达式来实现这一点:)

我有 maaaaaaaaany 请求,其中传递的参数很少,例如...&params=key1=value1|key2=value2|.... 参数可能很少,我不知道顺序。我需要的是捕获包含精确key1=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's(用 分隔|

需要明确的是:我知道两对 key=value 所以正则表达式仅用于匹配包含这 2 对的请求。请求可以以不同的方式排序。我无权访问请求本身,我只处理保存的数据(作为字符串)。

将使用正则表达式的语言是 PHP。但是我无法访问完整的代码,因为我们在 Web 应用程序界面中声明了正则表达式。

我想我需要两个积极的前瞻,就像(?=[^\s]*(key1=myValue1)[^\s]*){1}(?=[^\s]*(key2=myValue2)[^\s]*){1}但我无法让它工作并且时钟在滴答作响......

4

3 回答 3

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\ns 仅用于演示目的。
  2. 不可能在环视断言中捕获;因此第一组匹配没有环视断言。
  3. 此正则表达式不会防止 avalue1=key1可能巧合匹配 a的可能性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 回答