Regex 预匹配所有具有多个或多个条件

Regex 预匹配所有具有多个或多个条件,regex,preg-match-all,Regex,Preg Match All,我试图创建一个正则表达式模式来匹配一个字符串,其中两个字段(用逗号分隔)可以是 a) 空的, b) 一个字,或者 c) 用反斜杠(\)分隔的两个单词 这是一个日志文件,其中位置1是源用户名字段,位置2是目标用户字段,但如果存在域名(domain\username),则两者可以用反斜杠分隔 我已经尝试了我所能想到的一切,并且可以在三分之二的比赛中获胜,但不是所有的条件。下面是此字符串可能存在的变体。(有些东西1和有些东西2是在这种情况之前和之后发生的已知模式) 有些事1,,,有些事2 一些东西

我试图创建一个正则表达式模式来匹配一个字符串,其中两个字段(用逗号分隔)可以是

  • a) 空的,
  • b) 一个字,或者
  • c) 用反斜杠(\)分隔的两个单词
这是一个日志文件,其中位置1是源用户名字段,位置2是目标用户字段,但如果存在域名(domain\username),则两者可以用反斜杠分隔

我已经尝试了我所能想到的一切,并且可以在三分之二的比赛中获胜,但不是所有的条件。下面是此字符串可能存在的变体。(有些东西1和有些东西2是在这种情况之前和之后发生的已知模式)

有些事1,,,有些事2

一些东西1,dstuser,一些东西2

something1,,dstdomain\dstuser,something2

something1,srcdomain\srcuser,something2

something1,srcdomain\srcuser,dstdomain\dstuser,something2

something1,srcuser,dstdomain\dstuser,something2

Something 1,srcuser,dstuser,Something 2

something1、srcuser、something2

something1,srcdomain\srcuser,dstuser,something2

something1,srcdomain\srcuser,dstdomain\dstuser,something2

例如,我尝试过以下方法:

^.*something1,(,|(?J)(?<src_username>[^\\]*),|(?<src_domain>.*?)\\(?<src_username>[^\\]*),).*?,something2*
^.*something1,(,|(?J)(?[^\\]*),|(?[^\\\\\)\(?[^\\]*),).*,something2*
这在某些情况下是匹配的,但我很好奇这是否可以用一行正则表达式实现


提前感谢……

我想您正在寻找这个正则表达式:

(?J)^.*something1,(?:,|(?<src_username>[^,\\]+),|(?<src_domain>[^,\\]+)\\(?<src_username>[^,\\]+),)(?:,|(?<dst_user>[^\\,]+),|(?<dst_domain>[^,\\]+)\\(?<dst_username>[^,\\]*),)something2.*
(?J)^.*something1,(?:,|(?[^,\\]+),|(?[^,\\]+)\(?[^,\\]+),)(?:,|(?[^,\\\]+),|(?[^,\\]+)\(?[^,\\]*),)something2*
检查


我广泛使用否定字符类
[^,\\]
,以避免过度匹配并停留在“单元格”的边界内。此外,我还使用了
(?:…)
非捕获组来避免与捕获的组弄乱,并帮助保持输出干净。

为什么不在逗号上使用
分解
,然后保留您需要的内容?我正试图通过现有的解析器运行此操作,并且需要为src_域、dst_域和,src_用户和dst_用户存在时……工作正常。因此我遗漏了两件事:1)命名捕获或条件开始时的
?:
,2)我错误地使用了
[^\\]
,而应该使用
[^,\\]+)
谢谢!是的,主要是这样。我在答案中添加了关于非捕获组的注释。