0

我正在尝试解析非常复杂的 csv,它是在不使用逗号列的任何引号的情况下生成的。
我得到的唯一提示是,在字段之前或之后带有空格的逗号包含在字段中。

Jake,HomePC,Microsoft VS2010, Microsoft Office 2010

应该解析为

Jake
HomePC
Microsoft VS2010, Microsoft Office 2010

任何人都可以就如何在列正文中包含“\s”和“\s”提出建议。

4

3 回答 3

2

如果您的语言支持后向断言,请拆分

(?<!\s),(?!\s)

在 C# 中:

string[] splitArray = Regex.Split(subjectString, 
    @"(?<!\s) # Assert that the previous character isn't whitespace
    ,         # Match a comma
    (?!\s)    # Assert that the following character isn't whitespace", 
    RegexOptions.IgnorePatternWhitespace);
于 2012-07-13T13:13:20.657 回答
0

除以 r"(?!\s+),(?!\s+)"

在python中你可以这样做

import re
re.split(r"(?!\s+),(?!\s+)", s) # s is your string
于 2012-07-13T11:52:43.310 回答
0

试试这个。它给了我你提到的预期结果。

StringBuilder testt = new StringBuilder("Jake,HomePC,Microsoft VS2010, Microsoft Office 2010,Microsoft VS2010, Microsoft Office 2010");
Pattern varPattern = Pattern.compile("[a-z0-9],[a-z0-9]", Pattern.CASE_INSENSITIVE);
Matcher varMatcher = varPattern.matcher(testt);
List<String> list = new ArrayList<String>();
int startIndex = 0, endIndex = 0;
boolean found = false;
while (varMatcher.find()) {
endIndex = varMatcher.start()+1;
if (startIndex == 0) {
list.add(testt.substring(startIndex, endIndex));
} else {
startIndex++;
list.add(testt.substring(startIndex, endIndex));
}
startIndex = endIndex;
found = true;
}
if (found) {
if (startIndex == 0) {
list.add(testt.substring(startIndex));
} else {
list.add(testt.substring(startIndex + 1));
}
}
for (String s : list) {
System.out.println(s);
}

请注意,代码是用 Java 编写的。

于 2012-07-13T13:09:46.603 回答