.NET的Regex类和换行符

emp*_*mpi 5 .net c# regex

为什么.NET正则表达式不会将\n视为行尾字符?

示例代码:

string[] words = new string[] { "ab1", "ab2\n", "ab3\n\n", "ab4\r", "ab5\r\n", "ab6\n\r" };
Regex regex = new Regex("^[a-z0-9]+$");
foreach (var word in words)
{
    Console.WriteLine("{0} - {1}", word, regex.IsMatch(word));
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的回应:

ab1 - True
ab2
 - True
ab3

 - False
 - False
ab5
 - False
ab6
 - False
Run Code Online (Sandbox Code Playgroud)

为什么正则表达式匹配ab2\n

更新: 我不认为Multiline是一个很好的解决方案,也就是说,我想验证登录只匹配指定的字符,它必须是单行.如果我更改MultiLine选项的构造函数ab1,ab2,ab3和ab6匹配表达式,则ab4和ab5不匹配.

Jan*_*rts 10

.NET正则表达式引擎确实将其\n视为行尾.如果您的字符串具有Windows样式的\r\n换行符,则会出现问题.随着RegexOptions.Multiline开启$之间的匹配\r\n,而不是之前\r.

$也就像在字符串的最后一样匹配\z.区别在于,\z只能在字符串的最末端$匹配,而在尾随之前也匹配\n.使用RegexOptions.Multiline时,$也可以在任何之前匹配\n.

如果您遇到换行问题,首先要做的是搜索和替换以全部替换所有\r内容以确保所有行\n仅以换行结束.

  • 我更喜欢用"\n"替换"\ r \n",以防一些疯狂的文档本身只有一些"\ r"作为行结尾. (2认同)

Rem*_*ing 9

如果字符串以换行符结束,RegexOptions.Multiline则无效.该$会忽略最后换行符,因为有后,没有什么是.

如果要匹配直到字符串的最后并忽略任何换行符使用 \z

Regex regex = new Regex(@"^[a-z0-9]+\z", RegexOptions.Multiline);
Run Code Online (Sandbox Code Playgroud)

这适用于MutliLine和SingleLine,这无关紧要.