C#regex.split方法在括号前添加空字符串

时间:2011-07-08 02:07:42

标签: c# regex tokenize

我有一些代码将方程式输入标记为字符串数组:

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

5 个答案:

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