C#Tokenizer - 保留分隔符

时间:2009-07-15 21:52:43

标签: c# stringtokenizer

我正在努力将代码从JAVA移植到C#,而部分JAVA代码使用了tokenizer - 但我的理解是,Java中stringtokenizer的结果数组也会有分隔符(在这种情况下是+, - , /,*,(,))作为代币。我试图使用C#Split()函数,但它似乎消除了分隔符本身。最后,这将解析一个字符串并将其作为计算运行。我做了很多研究,但没有找到任何关于这个主题的参考文献。

有没有人知道如何让实际的分隔符按照它们遇到的顺序进入分割数组?

令牌化代码:

public CalcLexer(String s)
{
    char[] seps = {'\t','\n','\r','+','-','*','/','(',')'};
    tokens = s.Split(seps);
    advance();
}

测试:

static void Main(string[] args)
    {
        CalcLexer myCalc = new CalcLexer("24+3");
        Console.ReadLine();
    }

“24 + 3”会产生以下输出:“24”,“3”我正在寻找输出“24”,“+”,“3”

在完全披露的性质中,该项目是课堂作业的一部分,并使用以下完整的源代码:

http://www.webber-labs.com/mpl/source%20code/Chapter%20Seventeen/CalcParser.java.txt http://www.webber-labs.com/mpl/source%20code/Chapter%20Seventeen/CalcLexer.java.txt

3 个答案:

答案 0 :(得分:12)

您可以使用Regex.Split零宽度断言。例如,以下内容将分为+-*/

Regex.Split(str, @"(?=[-+*/])|(?<=[-+*/])");

有效地说,“如果-+*/之后跟着或先于任何{{1}},就会分裂。匹配的字符串本身将是零长度,所以你不会丢失任何部分输入字符串。

答案 1 :(得分:4)

这会产生你的输出:

string s = "24+3";
string seps = @"(\t)|(\n)|(\+)|(-)|(\*)|(/)|(\()|(\))";
string[] tokens = System.Text.RegularExpressions.Regex.Split(s, seps);

foreach (string token in tokens)
    Console.WriteLine(token);

答案 2 :(得分:1)

如果您想要一个非常灵活,强大,可靠且可扩展的解决方案,您可以使用C# port of ANTLR。有一些initial overhead (link is setup information for VS2008)可能导致这样一个小项目过度杀伤。这是一个calculator example with support for variables

你的班级可能有点过分,但如果你有兴趣了解这类现实世界问题的“真实”解决方案,请看看。我甚至有Visual Studio package for working with the grammars,或者您可以单独使用ANTLRWorks