Regex:忽略特定字符串或跳过/向前看特定括号



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

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

它与的预期一样工作

p:\Application\PativeCommon\Cws2esel.h(50(:警告C26812:枚举类型"Cws2essel::eVesselSource"未受限制。首选"enum class"'enum'(enum.3(。[P:\PativeFunctionLib.vcxproj]

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

C:\Program Files(x86(\MicrosoftVisualStudio\2021\Community\VC\Tools\MSVC\14.28.29333\include\xmemory(702,82(:警告C4244:"初始化":从"double"转换为"_Objty",可能的数据丢失[G:\agent_work\48\s\Application\FunctionLib.vcxproj]

这是我的代码:

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

regex101链接:https://regex101.com/r/n5kG86/1

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

请随时提出更好/更优雅的解决方案。

您可以使用以下正则表达式:

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

更新Regex Demo

前两个捕获组发生了重要变化:

  • ^:启动
  • (.+?):第一个将字符串与任意字符中的一个或多个匹配的捕获组(惰性匹配(
  • (:匹配开场(
  • (d[d,]*):第二个捕获组,用于匹配以数字开头、后跟0个或多个数字/逗号字符的字符串
  • ):匹配结束)