preg_match_all 具有多个 OR 条件

preg_match_all with multiple OR conditions

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

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

我已经尝试了所有我能想到的,并且可以从 3 中得到 2 个匹配,但不是所有条件。以下是该字符串可能存在的变体。(something1 和 something2 是在此条件之前和之后发生的已知模式)

something1,,,something2

something1,,dstuser,something2

something1,,dstdomain\dstuser,something2

something1,srcdomain\srcuser,,something2

something1,srcdomain\srcuser,dstdomain\dstuser,something2

something1,srcuser,dstdomain\dstuser,something2

something1,srcuser,dstuser,something2

something1,srcuser,,something2

something1,srcdomain\srcuser,dstuser,something2

something1,srcdomain\srcuser,dstdomain\dstuser,something2

例如,我试过这个:

^.*something1,(,|(?J)(?<src_username>[^\]*),|(?<src_domain>.*?)\(?<src_username>[^\]*),).*?,something2*

这匹配 一些 的时间,但我很好奇这是否可以用一行正则表达式实现。

提前致谢....

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

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

勾选demo

我广泛使用取反字符 class [^,\] 来避免过度匹配并保持在 "cell" 的边界内。此外,我利用 (?:...) 非捕获组来避免捕获的组混乱,并有助于保持输出干净。