Как вы сопоставляете строку с вложенными скобками среди других строк в скобках? - PullRequest
1 голос
/ 10 февраля 2020

У меня есть файл журнала, в котором я пытаюсь получить указанный раздел c из:

[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_" part будет всегда одинаковым .

Я пытался использовать что-то простое, например \[FIXED.*]\], но это работало только в верхней строке.

1 Ответ

3 голосов
/ 10 февраля 2020

Вы можете попробовать @"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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...