用Regex标识行尾(.net和c#)



(对于那些遇到同样情况的人,请注意这个问题可能是。net和c#指定的。)见下面Wiktor的回答)

在问这个问题之前,我读了很多相关的问题(包括这个:匹配换行符- n或rn?),但这些答案都不起作用。

在我的例子中,我想删除一些代码文件中的所有//注释。为了处理Mac, Unix, Windows中的文件,我需要一些东西来匹配//和/r,或/n,或/r/n之间的文本。

下面是代码文件的测试内容:
var text = "int rn = 0; //comment1.0rn" +
"int r = 0; //comment2.r" + 
"int n = 0; //comment3.n" + 
"end";
var txt = RemoveLineEndComment();

这里是正则表达式(如果你不是一个C字符,只关注正则表达式请):

public static class CommentRemover
{
private static readonly Regex RegexRemoveLineEndComment =
new(@"//.*$", RegexOptions.Multiline);
public static string RemoveLineEndComment(this string text)
{
var t = RegexRemoveLineEndComment.Match(text).Value;
return RegexRemoveLineEndComment.Replace(text, string.Empty);
}
}

我需要的是txt = "int rn = 0;r int r = 0; print n = 0; nend"。以下是正则表达式和相应的结果:

//。* $ =比;Txt ="int rn = 0; int r = 0; nend"(int n = 0缺失)

//. * (? = r n) =比;Txt ="int rn = 0;r int r = 0;//comment2。 print n = 0;//comment3 nend"(注释2和3是左)

//. * (= r n ?) =比;Txt ="int rn = 0; int r = 0; nend"(int n = 0缺失)

//.*(?=( r n | | r n)) =比;Txt ="int rn = 0; int r = 0; nend"(int n = 0缺失)

//.*(?=[ r n | | r n]) =比;Txt ="int rn = 0; int r = 0; nend"(int n = 0缺失)…

似乎r有问题,无法识别。如果我只使用rn,则正则表达式&;//.*(?=rn)&;下面的测试内容可以正常工作:

var text = "int rn = 0; //comment1.0rn" +
"int r = 0; //comment2.rn" + 
"int n = 0; //comment3.rn" + 
"end";
谁来帮我一下?谢谢你的帮助。

在。net中,.模式匹配回车(CR)字符。它匹配除LF字符以外的任何字符。

注意,没有选项或修饰符来重新定义这个.行为。

因此,您可以使用
var RegexRemoveLineEndComment =  new Regex(@"//[^rn]*", RegexOptions.Multiline);

参见c#演示。

如果您想要删除//之前的空白,请在模式开始处添加s*(任何空白)或[p{Zs}t]*(水平空白)。

最新更新