我正在帮助某人获得他希望的自定义编译器的结果,该编译器在一个字符串中读取xml文件的所有行,因此它将如下所示,并且因为他希望它能够支持"支持"在数组中调用变量最坏的情况如下所示:
"Var1 = [5,4,3,2]; Var2 = [2,8,6,Var1;4];"
我需要的是找到第一个&#34 ;;"在" ["和"]"拆分它,所以我坚持这个:
"Var1 = [5,4,3,2];
它还必须支持多个" [","]"例如:
"Var2 = [5,Var1,[4],2];"
编辑:最后一个"]"之间可能还有数据。和";" 例如:
"Var2 = [5,[4],2]Var1;
我能在这做什么?我有点卡住了。
答案 0 :(得分:3)
您可以尝试正则表达式,例如
string source = "Var1 = [5,4,3,2]; Var2 = [2,8,6,Var1;4];";
// 1. final (or the only) chunk doesn't necessary contain '];':
// "abc" -> "abc"
// 2. chunk has at least one symbol except '];'
string pattern = ".+?(][a-zA-Z0-9]*;|$)";
var items = Regex
.Matches(source, pattern)
.OfType<Match>()
.Select(match => match.Value)
.ToArray();
Console.Write(string.Join(Environment.NewLine, items));
结果:
Var1 = [5,4,3,2]abc123;
Var2 = [2,8,6,Var1;4];
答案 1 :(得分:1)
^([^;]+);
这个正则表达式适用于所有人。 您可以像这样使用它:
string[] lines =
{
"Var1 = [5,4,3,2]; Var2 = [2,8,6,Var1;4];",
"Var2 = [5,[4],2]Var1; Var2 = [2,8,6,Var1;4];"
};
Regex pattern = new Regex(@"^([^;]+);");
foreach (string s in lines){
Match match = pattern.Match(s);
if (match.Success)
{
Console.WriteLine(match.Value);
}
}
解释是:
^表示开始于和[^;]除了分号之外的任何内容 +表示重复一次或多次并且是;然后是分号
这会找到Var1 = [5,4,3,2];
以及Var1 = [5,4,3,2];
您可以看到输出HERE
答案 2 :(得分:0)
public static string Extract(string str, char splitOn)
{
var split = false;
var count = 0;
var bracketCount = 0;
foreach (char c in str)
{
count++;
if (split && c == splitOn)
return str.SubString(0, count);
if (c == '[')
{
bracketCount++;
split = false;
}
else if (c == ']')
{
bracketCount--;
if (bracketCount == 0)
{
split = true;
}
else if (bracketCount < 0)
throw new FormatException(); //?
}
}
return str;
}