众所周知,在.NET下面专门有个Regex类是处理正则表达式的。本人几年的编程经历,多多少少也接触了一些正则表式处理字符串的问题,可以说对于写正则表达式还算是小有心得。
这几年一直在.NET下面编程,与Regex类接触的也挺多的,老早就发现RegexOptions选项中有很多是其它语言(如C/C++,JS)的正则表达式中没有的,像是Compiled,ExplicitCapture,RightToLeft,Singleline几个就比较特别的。而Singleline和Multiline这两项单从字面上的意思来说是“单行模式”和“多行模式”,具体什么意思我也不会多解释了吧,用正正则表达式的人都知道。在我的潜意识里一直认为这两项是互斥的,不能同时存在,一直在下意识的避开同时去使用。
最近在做一个正则表达式的工具的时候也一直带着这个想法去做,把这两项做成了RadioButton单选框,程序写好后也调试过了,应该说绝大部分的情况下也没有什么问题----很多时候我们接触到的待匹配的字符串都只有一行,至少我是这样的,而且咱又不是专业测试人员啊------直到有一天一个同事跟我说了一下,在一次使用的过程中发现原来对这两个项的理解可能有些问题,我再回过头来仔细查阅了一下相关的文档------原来真的是我错了。字面上这个个意思是互斥的,没有问题,可是这两项修饰的地方不一样,Multiline修饰的是^与$,就是说没有Multiline的时候,把^和$与当作每一行(\n结尾的)的开头和结束来匹配,有Multiline的时候是与整个字符串的开头和结尾匹配;而Singleline修饰的是'.'的时候,就是说有Singleline的时候匹配的是所有字符(包括\n),没有Singleline的时候,匹配的是除\n外的所有字符。这两个根本就是不沾边的,也不是以前我想像的那样互斥的关系。
回过头来再看看RegexOptions枚举,这本身就是一个带Flag特性的枚举,说明里面的项一般情况下可以任意组合,这也间接说明了Multiline与Singleline是可以共存的。唉,只怪自己先入为主太深了,没有深入去了解每一项的含义,只是想当然。
明白自己错了就马上改程序了,好在对于程序来说改起来还是比较容易的,程序改好后顺便也看了看JS中的正则表达式,是不是也有这样的问题(我的程序是用来生成.NET和JS下的正则表达式的),还好虚惊一场,JS还是要简单的多,除了gim就没有别的了,g和i就不说了,不在本文的讨论范围之内。m和Multiline一个意思。要想在JS里达到.NET中Singleline的效果的话,只能用[.\n]别无它法。