我有一个像
这样的字符串一个,[1,2,3,{4,5},6],B,{C,d,[E,F],克},H
按,
拆分后,我希望得到5个项目,大括号或括号中的,
会被忽略。
一
[1,2,3,{4,5},6]
B'/ P>
{C,d,[E,F],克}
ħ
字符串中没有空格。是否有正则表达式可以实现它?
答案 0 :(得分:9)
你可以用这个:
var input = "a,[1,2,3,{4,5}],b,{c,d,[e,f]},g";
var result =
(from Match m in Regex.Matches(input, @"\[[^]]*]|\{[^}]*}|[^,]+")
select m.Value)
.ToArray();
这会找到任何匹配项:
[
后跟]
以外的任何字符,然后由]
{
后跟}
以外的任何字符,然后由}
,
对于您的示例输入,这将有效,但它无法处理[1,[2,3],4]
或{1,{2,3},4}
等嵌套组。为此,我建议一些更强大的正则表达式。既然您在评论中提到过您正在尝试解析Json,我建议您查看优秀的Json.NET库。
答案 1 :(得分:4)
正则表达式*不能用于解析嵌套结构**。
(* True 常规表达式,不含非regular扩展名)
(**任意深度和交错的嵌套结构)
但手工解析并不困难。首先,您需要找到不在括号或大括号中的,
。
string input = "a,[1,2,3,{4,5},6],b,{c,d,[e,f],g},h";
var delimiterPositions = new List<int>();
int bracesDepth = 0;
int bracketsDepth = 0;
for (int i = 0; i < input.Length; i++)
{
switch (input[i])
{
case '{':
bracesDepth++;
break;
case '}':
bracesDepth--;
break;
case '[':
bracketsDepth++;
break;
case ']':
bracketsDepth--;
break;
default:
if (bracesDepth == 0 && bracketsDepth == 0 && input[i] == ',')
{
delimiterPositions.Add(i);
}
break;
}
}
然后在这些位置拆分字符串。
public List<string> SplitAtPositions(string input, List<int> delimiterPositions)
{
var output = new List<string>();
for (int i = 0; i < delimiterPositions.Count; i++)
{
int index = i == 0 ? 0 : delimiterPositions[i - 1] + 1;
int length = delimiterPositions[i] - index;
string s = input.Substring(index, length);
output.Add(s);
}
string lastString = input.Substring(delimiterPositions.Last() + 1);
output.Add(lastString);
return output;
}
答案 2 :(得分:1)
即使它看起来很丑陋并且没有涉及正则表达式(不确定它是否是原始问题中的要求或很好的),这个替代方案应该有效:
class Program
{
static void Main(string[] args)
{
var input = "a,[1,2,3,{4,5}],b,{c,d,[e,f]},g";
var output = "<root><n>" +
input.Replace(",", "</n><n>")
.Replace("[", "<n1><n>")
.Replace("]", "</n></n1>")
.Replace("{", "<n2><n>")
.Replace("}", "</n></n2>") +
"</n></root>";
var elements = XDocument
.Parse(output, LoadOptions.None)
.Root.Elements()
.Select(e =>
{
if (!e.HasElements)
return e.Value;
else
{
return e.ToString()
.Replace(" ", "")
.Replace("\r\n", "")
.Replace("</n><n>", ",")
.Replace("<n1>", "[")
.Replace("</n1>", "]")
.Replace("<n2>", "{")
.Replace("</n2>", "}")
.Replace("<n>", "")
.Replace("</n>", "")
.Replace("\r\n", "")
;
}
}).ToList();
}
}