Regex 在正则表达式中提取测试字符串是否需要负前瞻?

Regex 在正则表达式中提取测试字符串是否需要负前瞻?,regex,apache,cookies,negative-lookahead,Regex,Apache,Cookies,Negative Lookahead,我的目标是在正则表达式的帮助下,从下面的字符串中删除不以“TEST”开头的标记 TESTA=abc; VAL2=def; TESTB=ghi; TESTC=jkl; VAL2=bla1; VAL3=bla2 基于在线阅读,我似乎需要创建一个正则表达式来匹配我想要的,然后对它使用负前瞻。然而,我无法想出一个 输入字符串: TESTA=abc; VAL2=def; TESTB=ghi; TESTC=jkl; VAL2=bla1; VAL3=bla2 匹配字符串: TESTA=abc; TES

我的目标是在正则表达式的帮助下,从下面的字符串中删除不以“TEST”开头的标记

TESTA=abc; VAL2=def; TESTB=ghi; TESTC=jkl; VAL2=bla1; VAL3=bla2
基于在线阅读,我似乎需要创建一个正则表达式来匹配我想要的,然后对它使用负前瞻。然而,我无法想出一个

  • 输入字符串:

    TESTA=abc; VAL2=def; TESTB=ghi; TESTC=jkl; VAL2=bla1; VAL3=bla2
    
  • 匹配字符串:

    TESTA=abc; TESTB=ghi; TESTC=jkl;
    
甚至可以在一个正则表达式中执行我想要的操作吗

我们需要将其放在apacheconf文件中。发送到Apache的一些cookie太大,导致我们的应用程序失败。我们尝试采用的方法是过滤应用程序未设置的所有cookie。我们可以强制执行某种限制,所有cookie都以特定前缀开头(如上面的示例中所使用的),并过滤其余的cookie

在Apache中,如果我使用下面的语法,它将用空字符串替换具有键TESTC及其字符串值的cookie。我可以增强正则表达式,使之与以TEST\u开头的键相匹配。因此,它基本上可以删除以下内容:>“TEST_key:VALUE FOR Cookie”。然而,我想要的恰恰相反。别管匹配的内容,用空字符串替换其他内容

RequestHeader编辑Cookie“(^TESTC=[^;];|;TESTC=[^;])”

类似于

[^=;]+(?<!TEST.)=[^;]+(?:$|;)
[^=;]+(?


它的作用是什么?

  • [^=;]+
    匹配到第一个
    =

  • (?反向查找。检查匹配的字符串前面是否有
    测试。

  • =[^;]+
    如果查找成功,则匹配到下一个

使用非贪婪量词 您不需要像零宽度断言或负向前看或向后看这样复杂的东西。您只需要在支持它的引擎中使用一个非贪婪的量词,如
*?
。例如,在Bash提示符下,仅使用egrep:

$ echo 'TESTA=abc; VAL2=def; TESTB=ghi; TESTC=jkl; VAL2=bla1; VAL3=bla2' |
  egrep -o 'TEST.*?;' | xargs

TESTA=abc; TESTB=ghi; TESTC=jkl;
您可以在Ruby、Python或Perl中执行类似操作。例如,使用Ruby:

str = 'TESTA=abc; VAL2=def; TESTB=ghi; TESTC=jkl; VAL2=bla1; VAL3=bla2'
str.scan(/TEST.*?;/).join " "
#=> "TESTA=abc; TESTB=ghi; TESTC=jkl;"

您应该始终发布您尝试过的内容,以便其他人可以指出您遗漏了什么以及您如何改进代码。bla2是否应该在之后使用分号?这将匹配其余的值…语言是什么?如果没有分号,问题将非常不清楚。使用更多信息修改了我的问题。正则表达式需要在Apache中使用配置文件