Regex 预匹配所有具有多个或多个条件
我试图创建一个正则表达式模式来匹配一个字符串,其中两个字段(用逗号分隔)可以是Regex 预匹配所有具有多个或多个条件,regex,preg-match-all,Regex,Preg Match All,我试图创建一个正则表达式模式来匹配一个字符串,其中两个字段(用逗号分隔)可以是 a) 空的, b) 一个字,或者 c) 用反斜杠(\)分隔的两个单词 这是一个日志文件,其中位置1是源用户名字段,位置2是目标用户字段,但如果存在域名(domain\username),则两者可以用反斜杠分隔 我已经尝试了我所能想到的一切,并且可以在三分之二的比赛中获胜,但不是所有的条件。下面是此字符串可能存在的变体。(有些东西1和有些东西2是在这种情况之前和之后发生的已知模式) 有些事1,,,有些事2 一些东西
- a) 空的,
- b) 一个字,或者
- c) 用反斜杠(\)分隔的两个单词
^.*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)我错误地使用了[^\\]
,而应该使用[^,\\]+)
谢谢!是的,主要是这样。我在答案中添加了关于非捕获组的注释。