preg_match_all 具有多个 OR 条件
preg_match_all with multiple OR conditions
我正在尝试创建一个正则表达式模式来匹配一个字符串,其中 2 个字段(用逗号分隔)可以是
- a) 空,
- b) 一个词,或
- c) 由反斜杠 (\) 分隔的 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" 的边界内。此外,我利用 (?:...)
非捕获组来避免捕获的组混乱,并有助于保持输出干净。
我正在尝试创建一个正则表达式模式来匹配一个字符串,其中 2 个字段(用逗号分隔)可以是
- a) 空,
- b) 一个词,或
- c) 由反斜杠 (\) 分隔的 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" 的边界内。此外,我利用 (?:...)
非捕获组来避免捕获的组混乱,并有助于保持输出干净。