C#通过正则进行Split的问题

C#中我有一段字符串: "name,title,,(a1,a1),'m1,m2',content",我想要的结果: ["name","title","","(a1,a1)","'m1,m2'","content"],直接使用Split(',')无法得到想要的结果,于是想使用Regex.Split通过正则进行分割,我应该如何定义分隔符?谢谢!

5个回答

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,最后在替换回来

分组中内嵌分隔符的得用编译原来的词法分析来做,正则也搞不了

qq_27848369
hot2dog 同意
2 年多之前 回复
showbo
支付宝加好友偷能量挖,胡杨等着我的招呼 回复jiangjiuh: 当然你要这样做可以先将你分组分隔符中的逗号想执行替换成其他内容,在分隔后遍历每个项替换回来
2 年多之前 回复
jiangjiuh
黑石雨 无法用正则定义出(不在括号,尖括号,单引号中的逗号),再进行分割吗?
2 年多之前 回复

先从分号开始开始分割,先用括号分割出(a1,a1)再用单引号分割出‘m1,m2’剩下的用逗号分隔就可以了啊

jiangjiuh
黑石雨 分步我可以正确进行分割的,我只是想直接用正则进行分割,不知道有没有这种可能
2 年多之前 回复
    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", @",(?=(?:[^'()]*[('][^()']*[)'])*[^')]*$)")
立即提问