【发布时间】:2016-06-24 07:00:08
【问题描述】:
我正在处理一些分隔文件。我需要做的第一件事是获取所有“行”。得到每一行后,我可以根据指定的分隔符进行拆分。因此,要获得行,我需要使用各种行名称(\r\n、\r、\n)来拆分字符串。以下内容一直有效,直到我在双引号中遇到换行符:
return content.Split(new string[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
因此,如果您考虑以下文本(我的原始文本在双引号中用 \" 而不是 "" 转义了双引号),其中每一行由一个行名称分隔,并且该行中的每个字段/列是由竖线“|”字符分隔:
string s = "row1 col1|\"row1 \"\"col2a\"\"\r\nrow1 col2b\"|row1 col3\nrow2 col1|\"row2 \"\"col2a\"\"\rrow2 \"\"col2b\"\"\"|row2 col3\r\nrow3 col1|\"row3 col2a\nrow3 col2b\"|row3 col3";
等于以下字符串:
row1 col1|"row1 ""col2a""{CRLF}row1 ""col2b"""|row1 col3{CRLF}row2 col1|"row2 ""col2a""{CRLF}row2 ""col2b"""| row2 col3{CRLF}row3 col1|"row3 col2a{CRLF}row3 col2b"|row3 col3
用我原来的方法拆分上面的结果是 5 行:
string[] result = s.Split(new string[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
但我想使用行分隔符 (\r\n, \r, \n) 将上述内容拆分为 3 行:
result[0] == "row1 col1|\"row1 \"\"col2a\"\"\r\nrow1 col2b\"|row1 col3"
result[1] == "row2 col1|\"row2 \"\"col2a\"\"\rrow2 \"\"col2b\"\"\"|row2 col3"
result[2] == "row3 col1|\"row3 col2a\nrow3 col2b\"|row3 col3"
有没有人幸运地想出一个正则表达式来分割行(引号内除外)?
感谢 Alan,这是我最终得到的结果:
public string[] GetLines (string fileContent) {
Regex regex = new Regex(@"^([^""\r\n]*(?:(?:""[^""]*"")*[^""\r\n]*))", RegexOptions.Multiline);
MatchCollection matchCollection = regex.Matches(fileContent);
string[] result = new string[matchCollection.Count];
for (int i = 0; i < matchCollection.Count; i++) {
Match match = matchCollection[i];
result[i] = match.Value;
}
return result;
}
【问题讨论】:
-
如果我错了,请纠正我。您是否尝试解析 CSV?
-
文件可以用任何分隔符分隔。逗号是一种选择。在我的具体情况下,它是一个管道分隔文件。
-
听起来不错。请在下面查看我的解决方案。它很灵活,您可以使用任何字段分隔符
标签: c# regex split newline double-quotes