Skip to main content
 首页 » 编程设计

c#之用于分行的正则表达式是否应该考虑 unix/dos 问题

2024年02月02日28daizhj

我不想将 XML 用于我的 T4 的输入文件,所以我制作了这个片段,将文档分成由空行分隔的 block 。

我是否适本地在此处将回车设为可选?

string s = @"Default 
Default 
 
CurrencyConversion 
Details of currency conversions. 
 
BudgetReportCache 
Indicates wheather the budget report is taken from query results or cache."; 
 
string oneLine = @"[\r]\n"; 
string twoLines = @"[\r]\n[\r]\n"; 
 
var chunks = Regex.Split(s, twoLines, RegexOptions.Multiline); 
 
var items = chunks.Select(c=>Regex.Split(c, oneLine, RegexOptions.Multiline)).ToDictionary(c=>c[0], c=>c[1]); 

注意:我永远不会想到这一点,但自从我开始使用 Git 以来,我看到它“说”了一些让我想起 unix2dos 问题的东西,这反过来让我想到了 Mono,最后如果我需要的话处理可移植性(假设目标是完美)。

请您参考如下方法:

您的正则表达式与您认为的不同。将 \r 放入集合中不会完成任何事情;表达式 [\r]\n 与 \r\n 的含义相同。

您可以使用 ? 运算符来完成这项工作:

string oneLine = @"\r?\n"; 
string twoLines = @"\r?\n\r?\n"; 

但是,我建议您使用常规的 String.Split 方法而不是正则表达式:

string[] oneLine = { @"\r\n", @"\n" }; 
string[] twoLines = { @"\r\n\r\n", @"\n\n" }; 
 
var chunks = s.Split(twoLines, StringSplitOptions.None); 
 
var items = 
  chunks.Select(c => c.Split(oneLine, StringSplitOptions.None)) 
  .ToDictionary(c => c[0], c => c[1]);