研究一下正则RegexOptions枚举的三个针对匹配行的区别,对应None,SingleLine(单行)和Multiline(多行)枚举值。
结论是:
- None:(.)匹配任何字符除了\n。^和$不起作用。
- Singleline:(.)匹配任何字符。^和$匹配整个字符串
- Multiline:(.)匹配任何字符除了\n。^和$匹配每行的开头和结尾。
另外貌似目前.NET的正则对\A和\Z支持的不是很好。
下面测试代码:(注意由于输出字符中有换行符,因此用ASCII码作输出)
//+ using System.Text.RegularExpressions;
static void Main()
{
var opts = new RegexOptions[]
{
RegexOptions.None, RegexOptions.Singleline, RegexOptions.Multiline
};
//一次用RegexOptions和指定正则来匹配并输出结果
foreach (var opt in opts)
{
test(opt, @".");
test(opt, @"^.*$");
}
}
//用指定RegexOptions正则选项和正则来匹配"A\nB"并输出结果
static void test(RegexOptions opt, string pattern)
{
Console.WriteLine("=== {0} - \"{1}\"", opt, pattern);
var regex = new Regex(pattern, opt);
var match = regex.Match("A\nB");
while (match.Success)
{
PrintString(match.Value);
match = match.NextMatch();
}
}
//输出字符串的ASCII码
static void PrintString(string s)
{
Console.WriteLine(BitConverter.ToString(Encoding.ASCII.GetBytes(s)));
}
输出:
=== None - "."
41
42
=== None - "^.*$"
=== Singleline - "."
41
0A
42
=== Singleline - "^.*$"
41-0A-42
=== Multiline - "."
41
42
=== Multiline - "^.*$"
41
42