如何使用正则表达式捕获 http 状态代码的第二个词?

How to capture second word of an http status code using regex?

我想使用正则表达式捕获 http 状态代码名称。

这是日志文件条目示例文本:

Completed in 0.01434 (69 reqs/sec) | Rendering: 0.00006 (0%) | DB: 0.00220 (15%) | 404 Not Found [https://www.sample.com/page/soaps/1.xml]

众所周知,http 状态代码因每个日志文件条目而异。它可以是以下之一:

200 OK 
401 Unauthorized
201 Created
422 Unprocessable Entity
302 Found
404 Not Found

我的捕获组应包含以下任一内容:

OK 
Unauthorized
Created
Unprocessable Entity
Found
Not Found

我当前的正则表达式如下所示:

\D+(\d+(?:\.\d+)?\s*\([^)]+\))\D+(\d+(?:\.\d+)?\s*\([^)]+\))\D+(\d+(?:\.\d+)?\s*\([^)]+\))\D+(\d{1,3})\D+([A-Z]{2}|[A-Z][a-z]{1,12}(\s[A-Z][a-z]{1,10})?)\D+(\[.*\])\K

但是如果你在 www.regex101.com 中 运行 它,你会发现它没有注册一个带有两个词的 http 状态代码(即无法处理的实体和未找到)。

我做错了什么?

你可以使用这个正则表达式

.*\| (\d+)\s+((?:\w|[^\S\r\n])*)

第一个捕获组是错误代码,第二个是消息。请注意,这不会捕获 link,如果没有 link,它会起作用。 作品如下

  • .*\| -> 点是一个贪婪的匹配,所以它捕获了最后一个 |
  • 之前的所有内容
  • 第一个捕获组
    • \d+ -> 一个或多个数字
  • \s+ -> 一个或多个 spaces
  • 第二个捕获组
    • ?: -> 表明该组是非捕获组。
    • 任何单词字符任何space但没有新行零个或多个(如果您确定有一条消息,您可以用加号替换星号)

为了不捕获换行符,我放置了一个双重否定正则表达式。 \S 表示没有白色-space,我用 ^ 否定它。所以 [^S\r\n] 表示除了新行之外没有白色-space 字符。