(这很像我的上一个问题,但我刚才意识到我试图解决错误的问题)
我正在构建类似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规范,但我不完全确定它们在这种情况下是什么。
答案 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
表示您是否在引号内。