c#正则表达式.拆分方法在括号前添加空字符串
本文关键字:添加 字符串 正则表达式 拆分 方法 | 更新日期: 2023-09-27 18:01:35
我有一些代码将一个等式输入标记为字符串数组:
string infix = "( 5 + 2 ) * 3 + 4";
string[] tokens = tokenizer(infix, @"(['+'-'*'(')'^''])");
foreach (string s in tokens)
{
Console.WriteLine(s);
}
现在是标记器函数:
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我会把它们过滤掉:
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();
}
你所看到的是因为你没有任何东西,然后是一个分隔符(即在字符串的开头是(
),然后是两个相邻的分隔符(即中间的)*
)。这是故意的。
正如你在String.Split
中发现的那样,该方法有一个可选的enum,你可以给它删除任何空条目,然而,正则表达式没有这样的参数。在您的特定情况下,您可以简单地忽略任何长度为0的令牌。
foreach (string s in tokens.Where(tt => tt.Length > 0))
{
Console.WriteLine(s);
}
嗯,一个选择是在之后过滤掉它们:
return RE.Split(noWSpaceInput).Where(x => !string.IsNullOrEmpty(x)).ToArray();
试试这个(如果你不想过滤结果):
tokenizer(infix, @"(?=[-+*()^''])|(?<=[-+*()^''])");
Perl演示:perl -E "say join ',', split /(?=[-+*()^])|(?<=[-+*()^])/, '(5+2)*3+4'"
(,5,+,2,),*,3,+,4
虽然在这种情况下使用匹配而不是分割会更好。
我认为你可以使用[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();
}