使用正则表达式提取数字

使用正则表达式提取数字

我有这个字符串:

> 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包含您的文本)。

相关内容