是否可以使用条件正则表达式来匹配字符串不同位置的一个字段,具体取决于它在字符串的早期发现的内容?
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 个不同的组,每个组都匹配以下内容:
- 第 1 组:
asdf
- 第 3 组:
10.0.0.1
- 第 4 组:
stuff
但是对于第 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) 可用,它允许子模式的名称重复。我不知道哪些想法最适合您的环境。
假设我有一个可能具有以下形式的字符串:
asdf - 10.0.0.1 [stuff] [xRelevantStuffx]
asdf [yRelevantStuffy] 10.0.0.1 [stuff] [xRelevantStuffx]
基本上在上面的场景中,我想要做的是有 4 个不同的组,每个组都匹配以下内容:
- 第 1 组:
asdf
- 第 3 组:
10.0.0.1
- 第 4 组:
stuff
但是对于第 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) 可用,它允许子模式的名称重复。我不知道哪些想法最适合您的环境。