Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Regex解析类似json的top对象_C#_Regex - Fatal编程技术网

C#Regex解析类似json的top对象

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; 这意味着: 新行->除空格和新行以外的任何内容->“{”->任何内容加新行->新行->}

我需要解析类似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;
这意味着:

新行->除空格和新行以外的任何内容->“{”->任何内容加新行->新行->}

预期的结果只是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]
    匹配换行符
  • \S+\S*
    匹配1+倍非空白字符,然后0+倍空白字符
  • {[\r\n]
    匹配开头
    {
    后跟换行符
  • (?:(?!})
    反向前瞻,断言直接在右侧的不是
    }
  • *[\r\n]
    将除换行符以外的任何字符匹配0多次,然后匹配换行符
  • }
    匹配结束
    }
|

例如:

        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;