Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# “之间的正则表达式替换”;武断的;分隔符_C#_.net_Regex_Delimiter_Replace - Fatal编程技术网

C# “之间的正则表达式替换”;武断的;分隔符

C# “之间的正则表达式替换”;武断的;分隔符,c#,.net,regex,delimiter,replace,C#,.net,Regex,Delimiter,Replace,关于在“任意”分隔符之间替换部分文本文件,我遇到了一些问题 以下是我想做的:我有如下的加价: // [ADX START] ANYTHING // [ADX END] <!-- [ADX START] --> ANYTHING <!-- [ADX END] --> /* [ADX START] */ ANYTHING /* [ADX END] */ string newFileContent = Regex.Matches

关于在“任意”分隔符之间替换部分文本文件,我遇到了一些问题

以下是我想做的:我有如下的加价:

//   [ADX START] ANYTHING //   [ADX END] 

<!--    [ADX START] --> ANYTHING <!-- [ADX END]  -->

/*   
 [ADX START] */  ANYTHING /*  [ADX END]        */
string newFileContent = Regex.Matches(fileContent, "(\\[ADX START\\].*\\[ADX END\\])", RegexOptions.IgnoreCase);
然而,这没有任何作用。我想让我困惑的是括号等。;此外,我希望能够简单地插入不同的评论风格,如#、//、/**/等


任何指向正确方向的指针都将受到欢迎。

*
通常不会在换行符之间匹配;您需要
RegexOptions.Singleline
才能做到这一点。但是,您应该使用
*?
获得非贪婪匹配。此外,您的正则表达式不会尝试捕获
[ADX START]
之前或
[ADX END]
之后的行部分。最后,您使用的是
Regex.Matches
,而不是
Regex.Replace
,因此它实际上不会修改任何内容

试试这个:

Regex commentRegex = new Regex(@"^.*?\[ADX START\].*?\[ADX END\].?$", RegexOptions.IgnoreCase | RegexOptions.Singleline);
string newFileContent = commentRegex.Replace(fileContent);

像这样使用singline选项和正则表达式

string strRegex =@"(\/\/|\/\*).*?\[ADX START\].*?\[ADX END\]\s*(\*\/)?";
                         ^                      ^                 ^
                         |                      |                 |->match */ 0 or 1 time
                         |                      |
                         |                      |->match lazily till the first ADX END
                         |->match // or /*
string s=Regex.Replace(fileContent,strRegex,"",RegexOptions.Singleline);//replace it

是否可以对分隔符使用更统一的注释语法?您好,Asad,谢谢您的评论。我不完全明白你的意思。然而,我所需要的只是一个正则表达式,它允许我“插入”两个任意的分隔符,然后将它们删除并替换这些分隔符之间的所有内容(包括分隔符本身)。对于这种不规则的输入,我不相信正则表达式是最好的选择。为此编写您自己的解析器。我考虑过这一点,因为使用解析器并不难做到这一点。但是,解析器不能忽略分隔符和注释之间的空白量。所以我必须考虑“//分隔符”和“//(更多空格)分隔符”和“/(更多空格)分隔符”等。;使用结束分隔符(更不用说可能的换行符)的可能性数量的幂。或者我强制要求注释和分隔符之间必须有一个空格。谢谢你的回答Barmar,我刚开始使用正则表达式,因此,我仍然有一些问题。我刚试过你的正则表达式,一个运行时错误告诉我括号不够。我试着把它放在最后的“?$”之前,但它没有产生预期的结果-无论如何,非常感谢你的正则表达式,我会把它拆开并试着理解它。
不需要接近开头,我只是去掉了它。现在试试。注意:我不是C#程序员,我可能对该语法的某些细节有错误。@Barmar use\而不是\\如果您使用的是逐字字符串,即
@”
@Fake.It.Til.Make.It Thx,fixed.Hi Fake.It.Til.U.Make.It,非常感谢您的出色解释和正则表达式!我开始了解它的工作原理,但是,当使用这个正则表达式时,输出字符串与输入字符串完全相同。我还喜欢它包含两种注释样式的方式,这样我就能够复制它使用“或”运算符来获取更多样式。您是否知道它为什么不起作用?我的输入如下:string contentBefore=@“哦,天哪,这绝对是太棒了。it.Til.U.Make.it!非常感谢。我现在理解了最后一个“匹配0或1”。但是,它与最后一个不匹配。例如,输入:”\r\n你是个超级巨星,伙计!非常棒,我甚至可以添加另一种评论风格:“(\/\/\/\/\/*\/*?”…再次非常感谢!:-)@TEST regex非常简单,伙计。”
Regex commentRegex = new Regex(@"^.*?\[ADX START\].*?\[ADX END\].?$", RegexOptions.IgnoreCase | RegexOptions.Singleline);
string newFileContent = commentRegex.Replace(fileContent);
string strRegex =@"(\/\/|\/\*).*?\[ADX START\].*?\[ADX END\]\s*(\*\/)?";
                         ^                      ^                 ^
                         |                      |                 |->match */ 0 or 1 time
                         |                      |
                         |                      |->match lazily till the first ADX END
                         |->match // or /*
string s=Regex.Replace(fileContent,strRegex,"",RegexOptions.Singleline);//replace it