【问题标题】:Tokenizing math expression with functions in C#用 C# 中的函数标记数学表达式
【发布时间】:2015-02-10 03:26:47
【问题描述】:

我认为这很容易找到,但我没有成功。

我需要能够标记以下表达式

(4 + 5) + myfunc('两个单词', 3, 5)

进入

(
4
+
5
+
myfunc
(
'two words'
,
3
,
5
)

这似乎是一种常见的需求,但是我还没有找到任何好的文档。这是我可以使用正则表达式做的事情吗?有人知道这样做的现有方法吗?

我正在使用 C#,但如果您有其他语言的答案,请不要害羞。

提前致谢。

【问题讨论】:

标签: c# parsing tokenize


【解决方案1】:

如果您正在寻找一个健壮而强大的解决方案,您应该明确地研究一个词法分析器(如 Antlr)。但是,如果您需要的只是像您提供的那样简单表达式的标记化,您可以很容易地实现此结果:

// TODO Refactor and optimize this function
        public IList<string> TokenizeExpression(string expr)
        {
            // TODO Add all your delimiters here
            var delimiters = new[] { '(', '+', ')', ',' };
            var buffer = string.Empty;
            var ret = new List<string>();
            expr = expr.Replace(" ", "");
            foreach (var c in expr)
            {
                if (delimiters.Contains(c))
                {
                    if (buffer.Length > 0) ret.Add(buffer);
                    ret.Add(c.ToString(CultureInfo.InvariantCulture));
                    buffer = string.Empty;
                }
                else
                {
                    buffer += c;
                }
            }
            return ret;
        }

例子:

TokenizeExpression("(4 + 5) + myfunc('两个词', 3, 5)") Count = 14

[0]: "("
[1]: "4"
[2]: "+"
[3]: "5"
[4]: ")"
[5]: "+"
[6]: "myfunc"
[7]: "("
[8]: "'twowords'"
[9]: ","
[10]: "3"
[11]: ","
[12]: "5"
[13]: ")"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多