This question already has answers here:
Does C# have a String Tokenizer like Java's?

(11个答案)


已关闭6年。




我正在将代码从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

最佳答案

您可以将Regex.Split与零宽度断言一起使用。例如,以下内容将在+-*/上拆分:

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

实际上,这说:“在此点上,如果后面跟着-+*/,则将其拆分。匹配的字符串本身将为零长度,因此您不会丢失输入字符串的任何部分。

关于C# token 生成器-保留分隔符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1134311/

10-17 02:05