Perl正则表达式查找不匹配的字符串

时间:2017-04-04 08:39:13

标签: regex apache perl mod-rewrite

我需要找到一个与perl中给定正则表达式不匹配的字符串。例如:如果字符串是:

%3C9ba91570d204095439e82b74ab4d74b0%3E%3Cma%3E%3C5975%3E

我需要抓取' ma'这是'%3C'和'%3E'子串。因此,应匹配这两个子字符串中的任何字符串。我的意思是,如果' ma'不在那里,它可能是任何其他字符串(' am'),如下例所示:

 %3C9ba91570d204095439e82b74ab4d74b0%3E%3Cam%3E%3C5975%3E

它将在apache中的RewriteRule中使用,以便将此获取的值存储在环境变量中。

我试过这个,但它没有给出我想要的东西:

RewriteEngine on
RewriteCond %{HTTP_COOKIE} (%3C.*?%3E%3C.*?)(.*)
RewriteRule ^.*$ - [E=FetchedValue:%2]

任何帮助解决这个问题都会很棒......!

2 个答案:

答案 0 :(得分:2)

如果您确定它始终是%3C和%3E之间的第二个字符串,则有多种可能性:

RewriteEngine on RewriteCond %{HTTP_COOKIE} %3C.*?%3E.*?%3C(.*?)%3E RewriteRule ^.*$ - [E=FetchedValue:%1]

答案 1 :(得分:1)

我认为你的正则表达式很好。另一方面,您有输入/规格问题。根据您的正则表达式考虑以下grep命令:

echo '%3C9ba91570d204095439e82b74ab4d74b0%3E%3Cma%3E%3C5975%3E' | grep -Po '%3C.*?%3E'
  • grep -P启用perl语法。我跳过了跟踪.*部分,否则它与您的正则表达式相同。
  • grep -o仅保留匹配

所以,我们得到了三场比赛,第二场比赛是你想要的:

$ echo '%3C9ba91570d204095439e82b74ab4d74b0%3E%3Cma%3E%3C5975%3E' | grep -Po '%3C.*?%3E'
%3C9ba91570d204095439e82b74ab4d74b0%3E
%3Cma%3E
%3C5975%3E

因此,这提出了两个问题:

  1. 这是一个有效的cookie值
  2. 您希望如何区分ma匹配与其他两个匹配?