0

这是我要解析的数据测试样本:

Content1
***
Content2
***
Content3
Content3
***

Content4
***
Content5

***
***
Content6
***
***
***
Content7

简而言之,数据条目由新行上的分隔符字符串分隔。我想获取 Content1、Content2、Content3\r\nContent3、\r\nContent4、Content5\r\n、Content6、Content7。我尝试了一个非常简单的 regex (\r\n)?^\*\*\*$(\r\n)?,它在 RegexBuddy 的 Split 中使用 '^$ match at line breaks' 选项和 .Net flavor selected 为我提供了正确的输出,尽管多个分隔符之间有空字符串,我知道我必须手动删除。但是,以下 C# 代码:

string regexPattern = string.Format(@"(\r\n)?^{0}$(\r\n)?", Regex.Escape("***"));
var records = Regex.Split(document, regexPattern, RegexOptions.Multiline);

返回我整个输入字符串。我在这里错在哪里?

另外,我不明白为什么正则表达式(\r\n)?\*\*\*(\r\n)?(它并不真正适合我,因为一个条目可以包含分隔符字符串)返回我 Content1、\r\n、\r\n、Content2、\r\n 等. \r\n 物品不应该被贪婪地抢走吗?RegexBuddy 用这个正则表达式给了我正确的输出。

4

1 回答 1

1

1. 究竟在哪里$匹配?

主要问题是$匹配字符之前\n,所以如果有任何\rbefore \n,你需要在模式中指定它。否则,将不返回任何匹配项。"\r$"您可以使用on测试拆分字符串"Content1\r\nContent2\r\nContent3"以查看效果。

只是一个示例,显示在哪里被认为是行首^和行尾$(在Multiline选项下)。第一行是原始字符串(新行和回车分别显示为\n和),第二行用和\r匹配的零长度字符串的位置进行注释。^$

***\r\nConte\rn\rt3\r\nCo\nntent3
^***\r$\n^Conte\rn\rt3\r$\n^Co$\n^ntent3$

为了解决这个问题,我们只需要\r$. 在下面第 3 节的解决方案中,我测试 optional \r,因为\r如果输入文件来自 UNIX 环境,则可能不存在。

2. 在结果中包含捕获的文本Regex.Split

从 .NET Framework 2.0 开始,Regex.Split将在分隔符处拆分字符串,并在结果数组中包含捕获的文本

要解决上述问题,只需将捕获组(捕获文本+分组属性)变为非捕获组 (?:pattern)(仅分组属性)。

三、结论

所以解决方案是:

var records = Regex.Split(document, @"(?:\r?\n)?^[*]{3}\r?$\n?", RegexOptions.Multiline);

ideone 上的演示

您可以单独处理结果中的空字符串。

于 2013-04-05T13:27:21.190 回答