为什么.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仅以换行结束.
如果字符串以换行符结束,RegexOptions.Multiline则无效.该$会忽略最后换行符,因为有后,没有什么是.
如果要匹配直到字符串的最后并忽略任何换行符使用 \z
Regex regex = new Regex(@"^[a-z0-9]+\z", RegexOptions.Multiline);
Run Code Online (Sandbox Code Playgroud)
这适用于MutliLine和SingleLine,这无关紧要.