C#Regex解析类似json的top对象
我需要解析类似json的文本文件,用C#Regex提取如下对象: i、 e.在一条直线的开始和结束处开始和结束的对象。 C#测试代码:C#Regex解析类似json的top对象,c#,regex,C#,Regex,我需要解析类似json的文本文件,用C#Regex提取如下对象: i、 e.在一条直线的开始和结束处开始和结束的对象。 C#测试代码: Regex regex = new Regex("\\n[^ \\n]+ \\{[.\\n]+\\n\\}"); string s = "\nfoo {\n line1\n line2\n}"; string v = regex.Match(s).Value; 这意味着: 新行->除空格和新行以外的任何内容->“{”->任何内容加新行->新行->}
Regex regex = new Regex("\\n[^ \\n]+ \\{[.\\n]+\\n\\}");
string s = "\nfoo {\n line1\n line2\n}";
string v = regex.Match(s).Value;
这意味着:
新行->除空格和新行以外的任何内容->“{”->任何内容加新行->新行->}
预期的结果只是s。但结果是空字符串。
如果我在末尾删除“\\n\\}”
:
Regex regex = new Regex("\\n[^ \\n]+ \\{[.\\n]+");
string s = "\nfoo {\n line1\n line2\n}";
string v = regex.Match(s).Value;
然后v=“\nfoo{\n”
这正如预期的那样工作,因此问题似乎来自
“\\n\\}”
对于示例数据,您可以匹配以大括号开头的第一行
然后使用重复模式匹配整行,前提是它不是以结束符开始的。您可以使用负前瞻(?!})
然后匹配右大括号
[\r\n]\S+\s*{[\r\n](?:(?!}).*[\r\n])*}
关于图案
匹配换行符[\r\n]
匹配1+倍非空白字符,然后0+倍空白字符\S+\S*
匹配开头{[\r\n]
后跟换行符{
反向前瞻,断言直接在右侧的不是(?:(?!})
}
将除换行符以外的任何字符匹配0多次,然后匹配换行符*[\r\n]
匹配结束}
}
Regex regex = new Regex(@"^\S+\s*{[\r\n](?:(?!}).*[\r\n])*}");
string s = @"foo {
line1
line2
}
bar {
line3
line4
}";
Console.WriteLine(regex.Match(s).Value);
结果:
foo {
line1
line2
}
我找到了一个可行的解决方案:
Regex r1 = new Regex("\\n[^ \\n]+ \\{[\\s\\S]+?\\n\\}");
string s = "\nfoo {\n line1\n line2\n}";
string v = r1.Match(s).Value;
现在v=“\n fo{\n line1\n line2\n}”
我不熟悉正则表达式,经过更多的研究,一篇参考文献说,当你在“[]”中加入“.”时,圆点将不再代表“任何东西”。你可以使用“[\s\s]”来表示一切,包括新行。“需要现成的解决方案”--那么平台错了,代码编写服务也错了…@sticky bit你知道我的意思,答案只是一行代码而不是一个程序。如果更多的人专注于回答问题而不是断章取义地使用法律,那就更好了。parse和regex完全是两码事。使用/编写解析器来解析@sticky bit和Sir Rufo:这正是我所说的“开箱即用的解决方案”。非开箱即用的解决方案不会解决问题,但可能会造成浪费时间的讨论。这里的原因是编写一个解析器(例如基于ANTLR的解析器)对一个新来者来说可能需要几天的时间,这里只需要一行代码就可以解决问题。也许
^\S+\S*{\n(?(?!})。*\n*}
你能提供一个基于我上面C#code的工作示例吗?我尝试了新的正则表达式(@“^\S+\S*{\n(?:!})。*\n)*}),但仍然得到空字符串。@jw#我已经更新了我的答案,并添加了一个使用[\r\n]
匹配换行符的示例。请在我上面的字符串上尝试:string S=“\nfoo{\n line1\n line2\n}”;我仍然得到空字符串。这是因为“\r”?我的文本文件只包含“\n”,而不是“\r\n”。啊,如果它应该以换行符开头,那么将^
更改为“\n”,就像我更新了答案一样。我认为,如果您有多个项目,您可能会生成[\s\s]+?
使用非贪婪?
否则你会匹配比你想要的更多,请看@第四只鸟你是对的,事实上我没有测试上述代码(在foo+bar上),我在另一个案例中发现了这一点。
Regex r1 = new Regex("\\n[^ \\n]+ \\{[\\s\\S]+?\\n\\}");
string s = "\nfoo {\n line1\n line2\n}";
string v = r1.Match(s).Value;