首页 > 解决方案 > 如何在其他括号字符串中匹配带有嵌套括号的字符串?

问题描述

我有一个日志文件,我试图从中提取特定部分:

[2020][159]Debugging: [FIXED_RANDOM_324 - Some Text[R] Here[TM]][PRODUCTION1] - [192.0.0.1] - [Mozilla]
[2021][532]Debugging: [FIXED_ABCDEF_21 - Simple][PRODUCTION2] - [192.0.0.32] - [Chrome]

我需要得到FIXED_RANDOM_324 - Some Text[R] Here[TM]FIXED_ABCDEF_21 - Simple

"FIXED_"部分将始终相同

我尝试使用一些简单的东西,\[FIXED.*]\]但这只适用于顶线。

标签: c#regex

解决方案


您可以尝试@"FIXED.*?(?=\]\[)"模式:

 FIXED  - fixed part
 .*?    - zero or more arbitrary characters (as few as posible)
 ][     - followed by ][ (but not included into the match) 

演示:

  string[] tests = new string[] {
    "[2020][159]Debugging: [FIXED_RANDOM_324 - Some Text[R] Here[TM]][PRODUCTION1] - [192.0.0.1] - [Mozilla]",
    "[2021][532]Debugging: [FIXED_ABCDEF_21 - Simple][PRODUCTION2] - [192.0.0.32] - [Chrome]",
  };

  Regex regex = new Regex(@"FIXED.*?(?=\]\[)");

  var result = tests
    .Select(test => regex.Match(test))
    .Where(match => match.Success)
    .Select(match => match.Value);

  Console.Write(string.Join(Environment.NewLine, result));

结果:

FIXED_RANDOM_324 - Some Text[R] Here[TM]
FIXED_ABCDEF_21 - Simple

编辑:如果我们想计算左括号和右括号,我们必须使用更详细的模式,例如

 @"FIXED(?:.*?(?<o>\[)?.*?(?<-o>\])?.*?)*(?=\])"

这里是平衡组以匹配左括号(?<o>\[)和相应的括号:(?<-o>\])

  string[] tests = new string[] {
    "[2020][159]Debugging: [FIXED_RANDOM_324 - Some Text[R] Here[TM]][PRODUCTION1] - [192.0.0.1] - [Mozilla]",
    "[2021][532]Debugging: [FIXED_ABCDEF_21 - Simple][PRODUCTION2] - [192.0.0.32] - [Chrome]",
    "[2021][532]Debugging: [FIXED_XYZ_02 - [Some][Text]][PRODUCTION2] - [192.0.0.32] - [Chrome]",
    "[2021][532]Debugging: [FIXED_XYZ_02 - [Some][Text] more][PRODUCTION2] - [192.0.0.32] - [Chrome]",
  };

  Regex regex = new Regex(@"FIXED(?:.*?(?<o>\[)?.*?(?<-o>\])?.*?)*(?=\])");

  var result = tests
    .Select(test => regex.Match(test))
    .Where(match => match.Success)
    .Select(match => match.Value);

  Console.Write(string.Join(Environment.NewLine, result));

结果:

FIXED_RANDOM_324 - Some Text[R] Here[TM]
FIXED_ABCDEF_21 - Simple
FIXED_XYZ_02 - [Some][Text]
FIXED_XYZ_02 - [Some][Text] more

推荐阅读