如何用也可以包含逗号的引号分隔逗号分隔字符串?
示例输入
John, Doe, "Sid, Nency", Smith预期输出:
用逗号分隔是可以的,但我已经要求允许使用"Sid,Nency“这样的字符串。我试图使用regexes来分割这些值。Regex ",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"来自Java,它对我的.NET代码不起作用。它使一些字符串加倍,找到额外的结果等。
那么,怎样才能最好地分割这些字符串呢?
发布于 2013-12-20 10:24:39
是因为抓捕组的缘故。把它变成一个非捕获组:
",(?=(?:[^""]*""[^""]*"")*[^""]*$)"
^^捕获组包括在您的结果中捕获的部分。
var regexObj = new Regex(@",(?=(?:[^""]*""[^""]*"")*[^""]*$)");
regexObj.Split(input).Select(s => s.Trim('\"', ' ')).ForEach(Console.WriteLine);把结果修剪一下。
发布于 2013-12-20 10:18:23
只要穿过你的绳子。当你穿过你的绳子时,保持追踪
不管你是不是在“街区”里。如果你-别把逗号当成
逗号(作为分隔符)。否则就把它当作这样对待。很简单
算法,我会自己写。当你第一次遇到“你进入”
一个街区。当你遇到下一个",你结束了你曾经的那块,等等。
所以你只需一次穿过你的绳子就可以做到。
import java.util.ArrayList;
public class Test003 {
public static void main(String[] args) {
String s = " John, , , , \" Barry, John \" , , , , , Doe, \"Sid , Nency\", Smith ";
StringBuilder term = new StringBuilder();
boolean inQuote = false;
boolean inTerm = false;
ArrayList<String> terms = new ArrayList<String>();
for (int i=0; i<s.length(); i++){
char ch = s.charAt(i);
if (ch == ' '){
if (inQuote){
if (!inTerm) {
inTerm = true;
}
term.append(ch);
}
else {
if (inTerm){
terms.add(term.toString());
term.setLength(0);
inTerm = false;
}
}
}else if (ch== '"'){
term.append(ch); // comment this out if you don't need it
if (!inTerm){
inTerm = true;
}
inQuote = !inQuote;
}else if (ch == ','){
if (inQuote){
if (!inTerm){
inTerm = true;
}
term.append(ch);
}else{
if (inTerm){
terms.add(term.toString());
term.setLength(0);
inTerm = false;
}
}
}else{
if (!inTerm){
inTerm = true;
}
term.append(ch);
}
}
if (inTerm){
terms.add(term.toString());
}
for (String t : terms){
System.out.println("|" + t + "|");
}
}
}发布于 2013-12-20 10:29:31
我在Csv解析器类中使用了以下代码来实现这一点:
private string[] ParseLine(string line)
{
List<string> results = new List<string>();
bool inQuotes = false;
int index = 0;
StringBuilder currentValue = new StringBuilder(line.Length);
while (index < line.Length)
{
char c = line[index];
switch (c)
{
case '\"':
{
inQuotes = !inQuotes;
break;
}
default:
{
if (c == ',' && !inQuotes)
{
results.Add(currentValue.ToString());
currentValue.Clear();
}
else
currentValue.Append(c);
break;
}
}
++index;
}
results.Add(currentValue.ToString());
return results.ToArray();
} // eo ParseLinehttps://stackoverflow.com/questions/20701179
复制相似问题