如何从字符串返回算术运算符

时间:2014-01-30 12:35:58

标签: c# string

我有一个<op>(</op><num>1553446</num><op>+</op><num>1553448</num><op>)</op>形式的字符串。运营商可以是+-*/。我需要以最有效的方式从这样的字符串中检索运算符(使用C#代码)。

数据不是XML的形式(虽然看起来像)。我有整个字符串。

字符串的其他示例

<op>(</op><num>1545646</num><op>*</op><num>1521248</num><op>)</op>

<op>(</op><num>1345346</num><op>/</op><num>15212</num><op>)</op>

提前致谢。

3 个答案:

答案 0 :(得分:1)

我已使用Regex来提取+ - / *numbers。获取元素后,可以根据需要使用它。

        string a = "<op>(</op><num>1553446</num><op>+</op>
                   <num>1553448</num><op>)</op>";

        Regex reg = new Regex(@"<op>[\+\-\*\/]?</op>");
        MatchCollection matches = reg.Matches(a);
        foreach (Match match in matches)
            Console.WriteLine("   " + match.Value); //output <op>+</op>

        reg = new Regex(@"<num>\d*</num>");
        matches = reg.Matches(a);
        foreach (Match match in matches)
            Console.WriteLine("   " + match.Value); 
        //output <num>1553446</num> <num>1553448</num>

        Console.ReadKey();

答案 1 :(得分:0)

您有两种选择来获取 元素值:

使用正则表达式。
使用XmlReaderXDocument

     XDocument xmlObj = XDocument.Load(str);
     var query = from c in xmlObj.Elements("op")
                 select c.Value; 

答案 2 :(得分:0)

什么是效率适合您?

  • 执行时间快但代码繁琐;
  • 快速实施且易于阅读?

根据此情况,您可以使用索引String::IndexOf()XDocument。它们处于相反的两极,但都有优点和缺点。

编辑:

好的,我看到你已经评论了很多,我想出了一个我永远不会使用的 UGLY 解决方案。但就我所知,这就是你想要的。

不要downvote,这是故意丑陋的代码:)

说,要解析的字符串是str。以下代码将告诉您字符串中的4个操作数中的哪一个,但绝对没有进行其他测试。这段代码可能是麻烦的源头,但是......你走了:

class ...
{
    private static readonly char[] OPERATORS = new char[] { '+', '-', '*', '/' };

    public char GetOperator(string str) // may be static
    {
        int i;

        i = str.Replace("</", "").IndexOfAny(OPERATORS);

        return i == -1 ? '_' : OPERATORS[i];
    }
}

如果没有识别出操作数,您将获得'_'下划线字符。 如果有多个操作员,您将只获得第一个操作员。