编辑
根据 cmets,很明显原始问题具有误导性。问题源于以下几点:
原始的 C# 代码使用包含精确字符序列的字符串文字\r\n,如下所示:
string input = "Example\r\nText";
字符串的内容随后原封不动地复制到在线正则表达式测试器,因此测试在以下等价物上运行:
string notActuallyTheInput = "Example\\r\\nText";
现在很清楚,这个问题意味着input 字符串文字写在一行上,但输入本身确实跨越了多行。因此,问题出在表达式的(.+?) 部分。与Robin mentioned 一样,. 字符默认不匹配换行符。所需的行为是 RegexOptions.Singleline 选项的行为,如以下示例程序所示。
using System;
using System.Text.RegularExpressions;
class Program
{
private const string Input =
"26. AUG\r\n2014\r\n27.08 Testing 1\r\n -100\r\n" +
"20. AUG\r\n2014\r\n27.08 Testing 2\r\n -90\r\n" +
"15. AUG\r\n2014\r\n27.08 Testing 3\r\n 200\r\n" +
"9. AUG\r\n2014\r\n27.08 Testing 4\r\n 50\r\n" +
"4. AUG\r\n2014\r\n27.08 Testing 5\r\n -200\r\n" +
"25. JUL\r\n2014\r\n27.08 Testing 5\r\n -200\r\n";
static void Main(string[] args)
{
string pattern = @"(.+?)(?=(\r\n\d{1,2}[.] [A-Z]{3})|$)";
var matches = Regex.Matches(Input, pattern, RegexOptions.Singleline);
Console.WriteLine("{0} Matches:", matches.Count);
foreach (Match match in matches)
Console.WriteLine(" {0}", match.Value.Replace("\r", "\\r").Replace("\n", "\\n"));
// OUTPUT:
//
// 7 Matches:
// 26. AUG\r\n2014\r\n27.08 Testing 1\r\n -100
// \r\n20. AUG\r\n2014\r\n27.08 Testing 2\r\n -90
// \r\n15. AUG\r\n2014\r\n27.08 Testing 3\r\n 200
// \r\n9. AUG\r\n2014\r\n27.08 Testing 4\r\n 50
// \r\n4. AUG\r\n2014\r\n27.08 Testing 5\r\n -200
// \r\n25. JUL\r\n2014\r\n27.08 Testing 5\r\n -200\r
// \n
}
}
原答案
问题可能源于将正则表达式错误地转换为 C# 字符串文字。
下面的表达式:
(.+?)(?=(\\r\\n\d{1,2}[.] [A-Z]{3})|$)
将在 C# 字符串文字中写成以下任一形式:
"(.+?)(?=(\\\\r\\\\n\\d{1,2}[.] [A-Z]{3})|$)"
@"(.+?)(?=(\\r\\n\d{1,2}[.] [A-Z]{3})|$)"
由于输入不包含任何引号字符,因此后者肯定是最简单的翻译,因为它是原始表达式的精确副本。
完整的程序重现结果
using System;
using System.Text.RegularExpressions;
class Program
{
private const string Input =
"26. AUG\\r\\n2014\\r\\n27.08 Testing 1\\r\\n -100\\r\\n" +
"20. AUG\\r\\n2014\\r\\n27.08 Testing 2\\r\\n -90\\r\\n" +
"15. AUG\\r\\n2014\\r\\n27.08 Testing 3\\r\\n 200\\r\\n" +
"9. AUG\\r\\n2014\\r\\n27.08 Testing 4\\r\\n 50\\r\\n" +
"4. AUG\\r\\n2014\\r\\n27.08 Testing 5\\r\\n -200\\r\\n" +
"25. JUL\\r\\n2014\\r\\n27.08 Testing 5\\r\\n -200\\r\\n";
static void Main(string[] args)
{
string pattern = @"(.+?)(?=(\\r\\n\d{1,2}[.] [A-Z]{3})|$)";
var matches = Regex.Matches(Input, pattern);
Console.WriteLine("{0} Matches:", matches.Count);
foreach (Match match in matches)
Console.WriteLine(" {0}", match.Value);
// OUTPUT:
//
// 6 Matches:
// 26. AUG\r\n2014\r\n27.08 Testing 1\r\n -100
// \r\n20. AUG\r\n2014\r\n27.08 Testing 2\r\n -90
// \r\n15. AUG\r\n2014\r\n27.08 Testing 3\r\n 200
// \r\n9. AUG\r\n2014\r\n27.08 Testing 4\r\n 50
// \r\n4. AUG\r\n2014\r\n27.08 Testing 5\r\n -200
// \r\n25. JUL\r\n2014\r\n27.08 Testing 5\r\n -200\r\n
}
}