我有一些代码将方程式输入标记为字符串数组:
string infix = "( 5 + 2 ) * 3 + 4";
string[] tokens = tokenizer(infix, @"([\+\-\*\(\)\^\\])");
foreach (string s in tokens)
{
Console.WriteLine(s);
}
现在这里是tokenizer函数:
public string[] tokenizer(string input, string splitExp)
{
string noWSpaceInput = Regex.Replace(input, @"\s", "");
Console.WriteLine(noWSpaceInput);
Regex RE = new Regex(splitExp);
return (RE.Split(noWSpaceInput));
}
当我运行它时,我将所有字符分开,但在括号字符之前插入一个空字符串...如何删除它?
//这里是空字符串
(
5
+
2
//这里是空字符串
)
*
3
+
4
答案 0 :(得分:3)
我会过滤掉它们:
public string[] tokenizer(string input, string splitExp)
{
string noWSpaceInput = Regex.Replace(input, @"\s", "");
Console.WriteLine(noWSpaceInput);
Regex RE = new Regex(splitExp);
return (RE.Split(noWSpaceInput)).Where(x => !string.IsNullOrEmpty(x)).ToArray();
}
答案 1 :(得分:2)
你所看到的是因为你没有分隔符(即在字符串的开头是(
),然后是两个彼此相邻的分隔符(即)*
在中间)。这是设计的。
正如您在String.Split
找到的那样,该方法有一个可选的枚举,您可以给它删除任何空条目,但是,没有正则表达式的参数。在您的特定情况下,您可以简单地忽略长度为0的任何标记。
foreach (string s in tokens.Where(tt => tt.Length > 0))
{
Console.WriteLine(s);
}
答案 2 :(得分:1)
试试这个(如果你不想过滤结果):
tokenizer(infix, @"(?=[-+*()^\\])|(?<=[-+*()^\\])");
Perl演示:
perl -E "say join ',', split /(?=[-+*()^])|(?<=[-+*()^])/, '(5+2)*3+4'"
(,5,+,2,),*,3,+,4
在这种情况下,最好使用匹配而不是拆分imo。
答案 3 :(得分:1)
好吧,一个选择是在之后过滤掉它们:
return RE.Split(noWSpaceInput).Where(x => !string.IsNullOrEmpty(x)).ToArray();
答案 4 :(得分:0)
我认为您可以通过拆分使用[StringSplitOptions.RemoveEmptyEntries]
static void Main(string[] args)
{
string infix = "( 5 + 2 ) * 3 + 4";
string[] results = infix.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
foreach (var result in results)
Console.WriteLine(result);
Console.ReadLine();
}