ETag正则表达式

时间:2009-08-26 13:59:42

标签: regex

我注意到Feedzirra使用此正则表达式从响应头获取ETag:

/.*ETag:\s(.*)\r/

我个人会写这个:

/ETag:\s(.*)\n/

这里有问题:

  1. 为什么即使不需要(\ A未指定),也会在开头放*。
  2. 为什么使用\ r而不是\ n?有什么区别?

4 个答案:

答案 0 :(得分:2)

  1. 我敢说完整。它不是捕获的一部分。但是,根据语言和实现的不同,可能会有一个隐含的线锚开始,在这种情况下可能是必要的。
  2. HTTP规范说HTTP是使用"\r\n"作为行尾。在大多数编程语言中,只有"\n"被视为行结尾。 \r确保在.*内不会吞下\ r \ n,这会在捕获结束时产生错误的空格。

答案 1 :(得分:1)

我同意。*开头不需要

/r and /n are different characters. 

/r = line ending for old macs
/n = line ending for *nix
/r/n = line ending for windows

probably [\r\n] would be best

答案 2 :(得分:1)

我们来看看HTTP specification

ETag header field定义为:

ETag = "ETag" ":" entity-tag

entitiy-tag定义为:

entity-tag = [ weak ] opaque-tag
weak       = "W/"
opaque-tag = quoted-string

quoted-string定义为:

quoted-string  = ( <"> *(qdtext | quoted-pair ) <"> )

因此 ETag 标头字段值可能包含换行符。正确的正则表达式是:

/ETag:\s+(?:W\/)?"(?:[ !#-\x7E\x80-\xFF]*|\r\n[\t ]|\\.)*"/

答案 3 :(得分:0)

HTTP RFC要求CRLF作为HTTP消息的换行符。因此,\n会将额外的\r与格式正确的消息匹配:

    generic-message = start-line
                      *(message-header CRLF)
                      CRLF
                      [ message-body ]
    start-line      = Request-Line | Status-Line

那就是说,为了健壮,我会把它[\r\n]