C# 如何在其他带括号的字符串中匹配带嵌套括号的字符串?
我有一个日志文件,试图从中提取特定部分:C# 如何在其他带括号的字符串中匹配带嵌套括号的字符串?,c#,regex,C#,Regex,我有一个日志文件,试图从中提取特定部分: [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] 我需要得到固定的\u RANDOM \u 324-一些文本[R]在这里[
[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]
我需要得到固定的\u RANDOM \u 324-一些文本[R]在这里[TM]和固定的\u ABCDEF \u 21-简单
固定部分将始终保持不变
我试着使用像\[FIXED.*]\]这样简单的东西,但这只在最上面一行起作用。你可以试试@FIXED.*.\][pattern:
演示:
结果:
编辑:如果我们想计算开始括号和结束括号,我们必须使用更精细的模式,例如
@"FIXED(?:.*?(?<o>\[)?.*?(?<-o>\])?.*?)*(?=\])"
您可以尝试@FIXED.*???=\]\[模式:
演示:
结果:
编辑:如果我们想计算开始括号和结束括号,我们必须使用更精细的模式,例如
@"FIXED(?:.*?(?<o>\[)?.*?(?<-o>\])?.*?)*(?=\])"
试试@FIXED.*.*.\]\[patternYes!成功了!你应该做一个答案,这样我就可以给你评分。试试@FIXED.*.*.*.*.\]\[patternYes!成功了!你应该做一个答案,这样我就可以给你评分了。但是它不能处理这样的情况,]后面没有直接跟[现在你提到它,FIXED\u XYZ\u 02-[Some][Text]不会正确匹配,但对我来说幸运的是,它可以充分处理99.9%的情况。@Kcoder:我明白了;如果[Some][Text]和类似的结构是问题所在,我们需要一个更详细的模式;我们通常使用漂白组来处理这个问题,即我们为每个操作匹配结束'][。请参阅我的编辑,但它不会处理以下情况]不是直接跟在[现在你提到了,FIXED_XYZ_02-[Some][Text]后面,它不会正确匹配,但幸运的是,它可以处理99.9%的情况。@Kcoder:我明白了;如果[Some][Text]和类似的结构是问题所在,我们需要一个更详细的模式;我们通常使用漂白组,即我们匹配结束']'对于每个操作[.请参见我的编辑
FIXED_RANDOM_324 - Some Text[R] Here[TM]
FIXED_ABCDEF_21 - Simple
@"FIXED(?:.*?(?<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