RegEx 使用两个可能的分隔符提取字符串

RegEx to extract a string using two possible delimiters

我想使用 Kusto RegEx 从 AppInsights 日志条目中提取时间跨度。 时间跨度可以有两种可能的形式:

TotalDuration [1 day, 2:09:13.830470] Categories
TotalDuration [2:09:13.830470] Categories

我已经弄清楚如何提取整个时间跨度:
正则表达式:"TotalDuration \[(.*?)\] Categories"

但我只想提取时间跨度组件 (2:09:13.830470)。

有没有一种方法可以说我希望值受以下限制:
( 天, )(此处为时间跨度)(] 类别) 或受以下限制的值:
(TotalDuration [)(此处为时间跨度)(] 类别)

IE。第一个分隔符可以是两个不同字符串中的任何一个。
是这样的: (天, TotalDuration [](此处为时间跨度)(]类别)

你可以试试这个:
TotalDuration \[(?:.+ )?(.*?)\] Categories
或者这个:
TotalDuration \[(?:.+,)?(.*?)\] Categories
示例:https://regex101.com/r/O2WJ3q/1
基本上你可以跳过 [] 中的所有字符,直到像 , 或 whitespace

这样的字符

您可以使用 negated character class 匹配直到方括号之间的最后一个 space 并将其设为可选 (?:[^\[\]\n]+ )?

除了使用 .*?,您还可以使用否定字符 class ([^\]\[\n]*) 以及捕获组来提高效率。

\bTotalDuration \[(?:[^\[\]\n]+ )?([^\]\[\n]*)\] Categories\b
  • \bTotalDuration 单词边界和匹配 TotalDuration
  • \[ 匹配 [
  • (?:非捕获组
    • [^[]\n]+ 匹配除换行符或方括号以外的任何字符 1 次以上
  • )? 关闭非捕获组并使其可选
  • ( 捕获 组 1
    • [^\]\[\n]* 匹配除换行符或方括号以外的任何字符 0 次以上
  • ) 关闭组 1
  • \] Categories\b匹配] Categories和单词边界

Regex demo