如何在逗号上拆分此字符串,但仅当它符合此条件时?

时间:2010-09-27 00:41:20

标签: c#

(这很像我的上一个问题,但我刚才意识到我试图解决错误的问题)

我正在构建类似jQuery的东西,我正在尝试解析选择器。所以,给出这样的东西:

a[href="http://weird.url/has,commas"], strong

如何将其拆分为

a[href="http://weird.url/has,commas"]
strong

需要在逗号上拆分,但前提是它不在引号或属性中。


max的解决方案的修改版本:

    static IEnumerable<string> SplitSelectors(string str)
    {
        int openBrackets = 0;
        int lastIndex = 0;

        for (int i = 0; i < str.Length; ++i)
        {
            switch (str[i])
            {
                case '[':
                    openBrackets++;
                    break;
                case ']':
                    openBrackets--;
                    break;
                case ',':
                    if (openBrackets == 0)
                    {
                        yield return str.Substring(lastIndex, i - lastIndex);
                        lastIndex = i + 1;
                    }
                    break;
            }
        }
        yield return str.Substring(lastIndex);
    }

我忽略了引号,因为我不会认为它们应该出现在属性选择器之外。我试图模仿jQuery规范,但我不完全确定它们在这种情况下是什么。

2 个答案:

答案 0 :(得分:2)

    static List<string> SplitByComma(string str)
    {
        bool quoted = false;
        bool attr = false;
        int start = 0;
        var result = new List<string>();
        for(int i = 0; i < str.Length; ++i)
        {
            switch(str[i])
            {
                case '[':
                    if(!quoted) attr = true;
                    break;
                case ']':
                    if(!quoted) attr = false;
                    break;
                case '\"':
                    if(!attr) quoted = !quoted;
                    break;
                case ',':
                    if(!quoted && !attr)
                    {
                        result.Add(str.Substring(start, i - start));
                        start = i + 1;
                    }
                    break;
            }
        }
        if(start < str.Length)
            result.Add(str.Substring(start));
        return result;
    }

答案 1 :(得分:1)

您需要逐个字符地将字符串解析为标记,并跟踪您是否在引号内。这些方面的东西:

for each char in text
  if char is quote
    if escaped = true
      escaped = false
    else
      escaped = true
  else if char is comma
    if escaped = true
      add char to token
    else
      begin new token
  else
    add char to token

其中escaped表示您是否在引号内。