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



假设我有一个字符串,可以是以下形式:

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

正则表达式

是否具有足够的条件匹配功能,以便我纯粹通过正则表达式完成此操作,或者我是否将尝试在这里找到利用外部字符串操作/逻辑的不同解决方案?

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

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

在 regex101 上查看此演示(如果您还需要完全匹配,请将.*附加到模式中)。


如果您需要更多组,但在交替中使用相同的组索引,另一个想法是在分支重置组中捕获,其中捕获组替代项共享相同的组索引。

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

regex101的另一个演示(分支重置在PCRE和JGsoft V2中可用)。


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

相关内容

最新更新