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

c#正则表达式.拆分方法在括号前添加空字符串

我会把它们过滤掉:

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();
    }