C#中我有一段字符串: "name,title,,(a1,a1),'m1,m2',content",我想要的结果: ["name","title","","(a1,a1)","'m1,m2'","content"],直接使用Split(',')无法得到想要的结果,于是想使用Regex.Split通过正则进行分割,我应该如何定义分隔符?谢谢!
static void Main(string[] args)
{
string str1 = "name,title,,(a1,a1),'m1,m2',content";
string pattern1 = @"(?<=(.*),(?=.*))";
string pattern2 = @"(?<=\'.*),(?=.*\')";
string replacement1 = @"%#$";
str1 = Regex.Replace(str1, pattern1, replacement1);
str1 = Regex.Replace(str1, pattern2, replacement1);
var strs1 = Regex.Split(str1, ",");
var strs2 = new string[str1.Length];
List temp = new List();
foreach (var str in strs1)
{
string tmp = null;
if(str.Contains(replacement1))
{
tmp = str.Replace(replacement1, ",");
}
else
{
tmp = str;
}
temp.Add(tmp);
}
Console.ReadKey();
}
先把()和''内的,号替换成特殊字符,然后split,最后在替换回来
分组中内嵌分隔符的得用编译原来的词法分析来做,正则也搞不了
先从分号开始开始分割,先用括号分割出(a1,a1)再用单引号分割出‘m1,m2’剩下的用逗号分隔就可以了啊
public static String[] SplitCsv(String value) {
if (Object.ReferenceEquals(null, value))
return null;
const Char quotation = '\'';
const Char separator = ',';
List<String> result = new List<String>();
Boolean inQuotation = false;
Boolean isStarted = false;
StringBuilder Sb = new StringBuilder();
foreach (Char Ch in value) {
if (inQuotation) {
Sb.Append(Ch);
inQuotation = Ch != quotation;
continue;
}
if (Ch == separator) {
result.Add(Sb.ToString());
Sb.Length = 0;
isStarted = true;
}
else {
Sb.Append(Ch);
isStarted = false;
inQuotation = Ch == quotation;
}
}
if (isStarted || (Sb.Length > 0))
result.Add(Sb.ToString());
return result.ToArray();
}
....
var test1 = SplitCsv("1,2,3"); // <- ["1", "2", "3"]
var test2 = SplitCsv("1,2,"); // <- ["1", "2", ""]
var test3 = SplitCsv("1,'2',3"); // <- ["1", "'2'", "3"]
var test4 = SplitCsv("1,'2,3'"); // <- ["1", "'2,3'"]
var test5 = SplitCsv("1,''"); // <- ["1", "''"]
谢谢大家帮忙,可惜并不是我需要的方法,我只是想要一段正则表达式来帮我分割这段字符串,目前已经在stackoverflow解决了,语句我写在后面了,还是很感谢大家:)
Regex.Split("name,title,,(a1,a1),'m1,m2',content", @",(?=(?:[^'()]*[('][^()']*[)'])*[^')]*$)")