Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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# dotnetregex使用名称空间及其内容捕获_C#_Regex - Fatal编程技术网

C# dotnetregex使用名称空间及其内容捕获

C# dotnetregex使用名称空间及其内容捕获,c#,regex,C#,Regex,我需要一个正则表达式来捕获using部分、名称空间名称和块的内容 使用ns1; 使用ns2; 使用别名=ns3.Class1; 名称空间ns4 { } 每行以windows CRLF结尾\r\n 我使用记事本++和多行选项使用。*?;*?:\r\n*名称空间.*?\r\n\{.*?\}:\r\n*\z但它在c中不起作用我试过了 我有一个控制台程序,可以在同一个名称空间中找到两个类文件,然后将它们的使用和名称空间块内容结合起来。我强烈建议不要使用正则表达式来处理源文件。正则表达式只会让事情变得更难

我需要一个正则表达式来捕获using部分、名称空间名称和块的内容

使用ns1; 使用ns2; 使用别名=ns3.Class1; 名称空间ns4 { } 每行以windows CRLF结尾\r\n

我使用记事本++和多行选项使用。*?;*?:\r\n*名称空间.*?\r\n\{.*?\}:\r\n*\z但它在c中不起作用我试过了


我有一个控制台程序,可以在同一个名称空间中找到两个类文件,然后将它们的使用和名称空间块内容结合起来。

我强烈建议不要使用正则表达式来处理源文件。正则表达式只会让事情变得更难。相反,我建议使用解析器,正如@Cid正确指出的那样

如果我理解正确,您需要合并两个C源文件。下面是我使用适当的解析器的解决方案

假设我有两个文件,F1.cs和F2.cs

F1.cs:

使用System.Text.RegularExpressions; 使用别名=System.Int32; 名称空间控制台AP3 { 公共类DummyClass1 { 公共别名DummyProperty{get;set;} } } F2.cs

使用制度; 名称空间控制台AP3 { 公共类DummyClass2 { 公共Int32 Kek{get;set;} } } 下面是我编写的一个快速而肮脏的程序,它使用解析器警告将两个C文件合并在一起:不是生产质量代码:

使用制度; 使用System.IO; 使用System.Linq; 使用System.Threading.Tasks; 使用Microsoft.CodeAnalysis.CSharp; 名称空间控制台AP3 { 公共静态类程序 { 公共静态异步任务主字符串[]args { var sourceFiles=wait Task.WhenAll//读取输入文件 File.ReadAllTextAsyncF1.cs, File.ReadAllTextAsyncF2.cs; var tokensOfInterest=sourceFiles //1.解析源文件 .Selectx=>CSharpSyntaxTree.ParseTextx //2.获取文件语法树根元素 .Selectx=>x.GetRoot //3.使用指令和命名空间声明获取所有顶级 .SelectManyroot=>root.ChildNodes.Wherenode=>node.Kind==SyntaxKind.UsingDirective ||node.Kind==SyntaxKind.NamespaceDeclaration //4.对它们进行排序,使using位于名称空间声明之前 .OrderByDescendingx=>x.Kind //5.获取原始令牌字符串 .Selectx=>x.ToString .托雷; var combined=string.JoinEnvironment.NewLine,tokensOfInterest; Console.WriteLinecombined; } } } 以下是F1.cs和F2.cs文件的输出外观:

使用System.Text.RegularExpressions; 使用别名=System.Int32; 使用制度; 名称空间控制台AP3 { 公共类DummyClass1 { 公共别名DummyProperty{get;set;} } } 名称空间控制台AP3 { 公共类DummyClass2 { 公共Int32 Kek{get;set;} } } 嗯。。。同一命名空间的两个命名空间声明。。。不漂亮,但这是有效的C,所以我没有费心做任何事。此文件按照您的预期进行编译和工作

不过,让我向你们保证——这种方法将比处理正则表达式的特殊情况容易得多,我只花了五到十分钟就想出了这个方法,这是我第一次使用C解析器,所以这绝对不是火箭科学


哦,你必须依靠Roslyn安装Microsoft.CodeAnalysis.CSharp NuGet软件包。尽管代价很小。

为什么不使用合适的C解析器呢?考虑到注释行和内容将是一件痛苦的事情。我不太熟悉使用解析器,但我可以肯定地看一看使用正则表达式的任何解决方案都很难处理嵌套的花括号:我想您可能需要所有名称空间ns4{…{…}…{…}…}在第一个}没有匹配的停止,对吗?因此,实际上,您需要的是解析器,而不是正则表达式;因此,matching}应该可以找到命名空间声明的右大括号一行和Microsoft.CodeAnalysis.CSharp包:CSharpSyntaxTree.ParseTextcsharp.GetRoot.DegenantNodes.OfType.Selectu=>u.Name.ToString支持使用内部命名空间间距有点混乱,但我可以运行一个工具来解决这个问题。谢谢