是否可以使用条件正则表达式来匹配字符串不同位置的一个字段,具体取决于它在字符串的早期发现的内容?

Can conditional regex be used to match one field at different locations of the string depending on what it finds early on in the string?

假设我有一个可能具有以下形式的字符串:

asdf - 10.0.0.1 [stuff] [xRelevantStuffx]

asdf [yRelevantStuffy] 10.0.0.1 [stuff] [xRelevantStuffx]

基本上在上面的场景中,我想要做的是有 4 个不同的组,每个组都匹配以下内容:

但是对于第 2 组,我希望它有所不同,具体取决于那个超 - 字符是否出现在早期。如果它确实出现,我想让第 2 组匹配 xRelevantStuffx。但如果它是一个非连字符值,我不关心字符串后面的内容,并希望它在 yRelevantStuffy 上匹配。

RegEx 是否具有足够的条件匹配功能,以便我完全通过 regex 来完成此操作,或者我是否要尝试在这里找到一个利用外部字符串的不同解决方案 manipulation/logic?

你可以做的是在 lookahead 中捕获并使从连字符到最后一个括号的部分可选。前瞻是零长度断言,并允许在放置它的地方执行操作。

^(\w+) (?=(?:-.*)?\[([^]]+)\]).*? ((?:\d+\.){3}\d+) \[([^]]+)\]

See this demo at regex101 (attach .* to the pattern if you need full match as well).


如果您需要更多组但交替使用相同的组索引,另一个想法是在 branch reset group 中捕获,其中捕获组替代方案共享相同的组索引。

^(\w+) (?=(?|-.*\[([^]]+)\]|\[([^]]+)\])).*? ((?:\d+\.){3}\d+) \[([^]]+)\]

Another demo at regex101分支重置在PCRE和JGsoft V2中可用)。


此外,至少在 PCRE 中有 J flag (PCRE_DUPNAMES) 可用,它允许子模式的名称重复。我不知道哪些想法最适合您的环境。