正则表达式:忽略特定字符串或特定括号前的 skip/look

Regex : ignoring particular string or skip/look ahead certain bracket

我正在使用此正则表达式匹配并从日志行中提取信息:

^([^(]+)\(([^)]+)\):\s([\w]+)\s([^:]*):\s(.*)\s\[([^\]]+)\]$

对于

,它按预期工作

P:\Application\PativeCommon\Cws2essel.h(50): warning C26812: The enum type 'Cws2essel::eVesselSource' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). [P:\PativeFunctionLib.vcxproj]

但由于下一行中的 (x86) 而失败

C:\Program Files (x86)\Microsoft VisualStudio21\Community\VC\Tools\MSVC.28.29333\include\xmemory(702,82): warning C4244: 'initializing': conversion from 'double' to '_Objty', possible loss of data [G:\agent_work\s\Application\FunctionLib.vcxproj]

这是我的代码:

let rx = /^([^(]+)\(([^)]+)\):\s([\w]+)\s([^:]*):\s(.*)\s\[([^\]]+)\]/
let [, codeFile, codeLine, severity, ruleId, message, project] = logLine.match(rx);

regex101 Link: https://regex101.com/r/n5kG86/1

我也需要做哪些修改才能解析带有 (x86) 的行。 有没有办法忽略这个特定的字符串或者向前看并匹配最接近 :

()

请随时提出 better/more 优雅的解决方案。

您可以使用这个正则表达式:

^(.+?)\((\d[\d,]*)\):\s(\w+)\s([^:]*):\s(.*)\s\[([^\]]+)\]$

Updated Regex Demo

前 2 个捕获组有重要变化:

  • ^: 开始
  • (.+?):第一个捕获组匹配一个字符串与一个或多个任意字符(惰性匹配)
  • \(: 比赛开始(
  • (\d[\d,]*):第二个捕获组匹配以数字开头后跟 0 个或多个 digit/comma 个字符的字符串
  • \):比赛结束)