我用过的每一种正则表达式都一直都有"." 字符匹配除了新行(\ r或\n)之外的所有内容...当然,除非您启用单行标志.
所以,当我尝试以下C#代码时,我感到震惊:
Regex rgx = new Regex(".");
if (rgx.Match("\r\n").Success)
MessageBox.Show("There is something rotten in the state of Redmond!");
Run Code Online (Sandbox Code Playgroud)
它显示了这个消息.为了确保我不会疯狂,我尝试了以下JavaScript代码:
if (/./.test("\r\n"))
alert("Something's wrong with JavaScript too.");
Run Code Online (Sandbox Code Playgroud)
JavaScript没有显示消息,这意味着它的工作正常.
显然,"." .NET中的字符与"\ r"字符匹配.我查看了 文档,看看是否有任何关于它的内容:
通配符:匹配除\n之外的任何单个字符.
哇...因为一个正则表达式的味道什么时候点匹配一个回车?您会认为.NET的行为与其他所有正则表达式的行为一样......特别是因为它在Windows环境中使用"\ r \n"作为行分隔符.
是否有任何标志/设置可以让它像其他Regex口味一样工作?是否有任何其他解决方案不涉及替换所有.字符[^\r\n]?
Ste*_*ham 16
在写Regex Hero时遇到了同样的问题.这有点奇怪.我在这里写了关于这个问题的博客.这导致我向测试人员添加了一个功能来启用/禁用CRLF.无论如何,出于某种原因,Microsoft选择使用\n(换行符)来标记行结尾.
(更新)原因必须与此相关:
Microsoft .NET Framework正则表达式包含其他正则表达式实现的最常用功能,例如Perl和awk中的那些..NET Framework正则表达式旨在与Perl 5正则表达式兼容,包括其他实现中尚未见到的功能,例如从右到左匹配和即时编译. http://msdn.microsoft.com/en-us/library/hs600312.aspx
正如Igor所说,Perl具有相同的行为.
现在,Singleline和Multiline RegexOptions会根据点和换行符更改行为.您可以启用Singleline RegexOption,以使点与换行匹配.并且您可以启用Multiline RegexOption,以便^和$标记每一行的开头和结尾(用换行符表示).但是你不能改变点(.)运算符的固有行为来匹配除\ r \n之外的所有内容.
| 归档时间: |
|
| 查看次数: |
8306 次 |
| 最近记录: |