我正在做一些分隔文件处理。我要做的第一件事是获取所有“行”。得到每一行之后,我可以根据指定的分隔符进行分割。因此,要获取行,我需要使用各种行名称(\ 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"
有谁有运气想出一个正则表达式拆分行(引号内除外)?
由于艾伦,这就是我最终得到的:
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;
}
最佳答案:
Matches()Split()
Regex r = new Regex(@"(?m)^[^""\r\n]*(?:(?:""[^""]*"")+[^""\r\n]*)*");
MatchCollection m = r.Matches(s);
内部部分
(?:(?:"[^"]*")+
与可能包含转义引号的双引号字符串匹配。整个正则表达式与可能包含一个或多个双引号字符串的行匹配。请注意,内部字符类([^"]
)可以匹配\r
和\n
,其中外部字符类([^"\r\n]
)明确排除它们。行起始锚(在多行模式下为^
)可防止实际匹配之间出现虚假的空匹配。这是demo。 (它在PCRE中,但我也在.NET中对其进行了测试。)