我有这个字符串:
> HTTP/1.1 200 OK Date: Tue, 12 Nov 2013 15:26:17 GMT Server:
> Apache/2.2.3 (CentOS) Last-Modified: Fri, 08 Nov 2013 21:34:50 GMT
> ETag: "452//path/to/file"
> Accept-Ranges: bytes Content-Length: 26010 Connection: close
> Content-Type: text/plain; charset=UTF-8
并且想要提取之前//
和之后的452 ETag
,我应该使用什么正则表达式?
答案1
让我们将您的请求分解为各种语法部分:
摘录452
您尚未指定该数字是否始终为 452 或是否为另一个数字,但我推测它可能是另一个数字,因为否则您就不需要正则表达式了。首先,您要查找一位数字,其语法是\d
。如果您要查找 3 位数字,则可以执行\d\d\d
此操作,可以更清晰地写为\d{3}
。如果您想要任何整数,无论位数是多少,您都可以使用+
运算符,表示一个或多个。因此,让我们假设您想要捕捉最一般的情况,在这种情况下您将使用\d+
。
在 // 之前
这需要所谓的积极前瞻。你可以查看有关前瞻的更多信息,但要点是它只会查找后面跟着前瞻指示的文本的匹配项,但不会在匹配项中包含前瞻的文本。前瞻的语法是,(?=@@@)
其中@@@
是紧跟匹配项的正则表达式。例如,查找//
将用 来表示(?=//)
。
在 ETag 之后
为此,我们将使用正向前瞻的反面:正向后瞻。其语法是,(?<=@@@)
其中@@@
是匹配项之前的正则表达式。例如,查找ETag: "
将是(?<=ETag: ")
综合起来,您将使用正向后视、要搜索的匹配和正向前视。因此,您要查找的正则表达式将是:
(?<=ETag: ")\d+(?=//)
Etag: "
这将检索文本和之间的任意数字的整数//
。
我假设您已经有一个可以运行正则表达式的环境。如果没有,Stack Exchange 上的其他问题将能够帮助您找到一个。
答案2
有多种方法可以做到这一点,具体取决于您喜欢的工具。使用awk
:
$ awk '/ETag: "[0-9]+\/\// { printf "%s\n", gensub(".*ETag: \"([0-9]+)//.*", "\\1", $0); }' < mylog
452
(假设该文件mylog
包含您的文本)。