使用 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]*
(水平空格)。
(遇到相同情况的朋友请注意,此问题可能是.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]*
(水平空格)。