我正在做一些分隔文件处理。我要做的第一件事是获取所有“行”。得到每一行之后,我可以根据指定的分隔符进行分割。因此,要获取行,我需要使用各种行名称(\ 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中对其进行了测试。)