Вы можете попробовать @"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