使用 Regex(.net 和 C#)识别行尾

Identify line end with Regex (.net and C#)

(遇到相同情况的朋友请注意,此问题可能是.net和C#指定的。请参见下面Wiktor的回答。)

在问这个问题之前,我已经阅读了许多相关问题(包括:Match linebreaks - \n or \r\n?),但其中 none 个答案有效。

就我而言,我想删除某些代码文件中的所有//注释。要处理 Mac、Unix、Windows 中的文件,我需要一些东西来匹配 // 和 /r、/n 或 /r/n.

之间的文本

代码文件测试内容如下:

        var text = "int rn = 0; //comment1.0\r\n" +
                   "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\nint r = 0; \rint n = 0; \nend"。 以下是正则表达式和相应的结果:

//.*$ => txt="int rn = 0; \nint r = 0; \nend"(缺少 int n = 0)

//.*(?=\r\n) => txt="int rn = 0; \r\nint r = 0; //comment2.\rint n = 0; //comment3 .\nend"(剩下评论2和3)

//.*(?=\r?\n?) => txt="int rn = 0; \nint r = 0; \nend"(缺少 int n = 0)

//.*(?=(\r\n|\r|\n)) => txt="int rn = 0; \nint r = 0; \nend" (int n = 0丢失)

//.*(?=[\r\n|\r|\n]) => txt="int rn = 0; \nint r = 0; \nend" (int n = 0不见了) ...

\r好像有问题,无法识别。 如果我只使用 \r\n,则正则表达式“//.*(?=\r\n)”适用于以下测试内容:

        var text = "int rn = 0; //comment1.0\r\n" +
                   "int r = 0; //comment2.\r\n" + 
                   "int n = 0; //comment3.\r\n" + 
                   "end";

有人帮帮我吗?感谢您的帮助。

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

请注意,没有选项或修饰符可以重新定义此 . 行为。

因此,您可以使用

var RegexRemoveLineEndComment =  new Regex(@"//[^\r\n]*", RegexOptions.Multiline);

参见C# demo

如果您还想删除 // 之前的空格,请在模式开头添加 \s*(任意空格)或 [\p{Zs}\t]*(水平空格)。