【问题标题】:How to parse string and prepare it for math如何解析字符串并为数学做准备
【发布时间】:2020-08-25 09:38:10
【问题描述】:

我想用以下代码将乳胶字符串解析为数学表达式

static string ParseString(List<string> startItems, string input)
{
    foreach (var item in startItems)
    {
        int charLocation = input.IndexOf(item, StringComparison.Ordinal);
        if (charLocation > 0)
        {
            switch (input.Substring(0, charLocation).Last())
            {
                case '{':
                case '+':
                case '-':
                case '*':
                    break;
                default: 
                    input = input.Replace(item, "*" + item); 
                    break;
            }
        }
    }
    return input;
}
static void Main(string[] args)
{
    string ToParse = @"\sqrt{3}\sqrt{3}*4\sqrt{3}";
    ToParse = ParseString(new System.Collections.Generic.List<string> { @"\frac", @"\sqrt" }, ToParse);
    Console.WriteLine(ToParse);
}

我应该在每个 \sqrt 单词乘以 char 之前得到。但是我的程序在第一个 \sqrt 中中断并且无法解析其他的。 结果是

\sqrt{3}\sqrt{3}*4\sqrt{3}

我想得到

\sqrt{3}*\sqrt{3}*4*\sqrt{3}

抱歉英语不好。

【问题讨论】:

  • 你能添加结果字符串吗?
  • @GuruStron 完成
  • 我的意思是你想得到什么。
  • 公式解析器或求解器绝非易事。这是其中之一,你最好只使用别人的代码。我从来不需要一个,所以我不能给你建议。
  • 还有一个link

标签: c#


【解决方案1】:

根据提供的示例,您可以像input = input.Replace(item, "*" + item).TrimStart('*'); 一样简单(Replace 替换所有出现的字符串/字符)。

至于你的代码,你有下一个问题:

  • 首先包含 \sqrt 会返回 charLocation 设置为 0(数组在 C# 中是基于 xero 的),因此您的检查 charLocation &gt; 0 评估为 false,因此没有任何反应
  • input.Substring(i, l) 接受 2 个参数 - 起始索引和 length,因此使用您的 charLocation 作为第二个参数是不正确的(即使您删除之前的检查,input.Substring(0, charLocation).Last() 也会以异常 Sequence contains no elements 结束)。

因此,如果您想遍历所有事件并根据某些逻辑插入符号,那么您需要有一些循环并移动起始索引并计算长度(并且还使用其他东西,而不是 Replace)。或者您可以深入了解Regular Expressions

【讨论】:

  • 你的正则表达式会有所帮助
猜你喜欢
  • 2012-11-05
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多