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

C# 如何从字符串返回算术运算符,c#,string,C#,String,我有一个字符串的形式是(1553446+1553448)。操作员可以是+、-、*或/。我只需要以最有效的方式(使用C代码)从这样的字符串中检索运算符 数据不是XML的一种形式(尽管它可能看起来像)。我把绳子作为一个整体 字符串的其他示例 (1545646*1521248) (1345346/15212) 提前感谢。您有两个选项可以获取元素值: 使用正则表达式。 使用或: 什么对你有效 执行时间快,但代码繁琐 快速实施且易于阅读 根据这一点,您可以使用索引、String::IndexOf()或

我有一个字符串的形式是
(1553446+1553448)
。操作员可以是
+
-
*
/
。我只需要以最有效的方式(使用C代码)从这样的字符串中检索运算符

数据不是XML的一种形式(尽管它可能看起来像)。我把绳子作为一个整体

字符串的其他示例

(1545646*1521248)

(1345346/15212)


提前感谢。

您有两个选项可以获取元素值:

使用正则表达式。
使用或:

什么对你有效


  • 执行时间快,但代码繁琐
  • 快速实施且易于阅读
根据这一点,您可以使用索引、
String::IndexOf()
XDocument
。他们处于对立的两极,但都有优点和缺点

编辑:

好的,我知道你已经评论了很多,我提出了一个非常丑陋的解决方案,我永远不会使用。但据我所知,这是你想要的

不要投反对票,这是故意的丑陋代码:)

比如说,要分析的字符串是
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];
    }
}
类。。。
{
私有静态只读字符[]运算符=新字符[]{'+','-','*','/'};
public char GetOperator(string str)//可能是静态的
{
int i;

i=str.Replace(“我已经使用
Regex
提取
+
-
/
*
数字
。获取元素后,可以根据需要使用它

        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();
string a=“(1553446+
1553448)";
正则表达式reg=新正则表达式(@“[\+\-\*\/]”);
MatchCollection matches=注册匹配项(a);
foreach(匹配中的匹配)
Console.WriteLine(“+match.Value);//输出+
reg=新的正则表达式(@“\d*”);
匹配项=注册匹配项(a);
foreach(匹配中的匹配)
Console.WriteLine(“+match.Value”);
//输出1553446 1553448
Console.ReadKey();

研究正则表达式……如果这是XML,你不是真的在尝试提取任何
op
元素的内容吗?我还建议你首先关注正确和简单的代码,然后定义性能要求,看看你是否能用简单的代码满足它们。尝试直接获取最高效的代码“可能”几乎从来都不是一个好主意。这些数据不是来自XMLSo,使用
正则表达式
将是一个不错的选择…但不知道如何使用…所以需要帮助!!但是如果在开始/结束处添加一个打开/关闭的根元素,它是否始终是有效的XML?特别是,您的示例显示了
作为
元素的内容…是否会有一个
我不会使用它们中的任何一个-我只需要将文档加载到
XDocument
中,然后直接从那里开始。两行代码…@JonSkeet当然,你是对的。注意,字符串目前不是非常有效的XML-你需要类似
“+str+”的东西“
-此时您需要将其作为
XElement
而不是
XDocument
加载,或者使用
xmlobj.Root.Elements(“op”)
@anatoligabuza您的解决方案将为我提供操作符
这也是我不需要的。此外,正如@JonSkeet所说,字符串的XML格式不完全有效。执行速度快,但很麻烦code@user1603970:您定义了性能要求了吗?如果您还没有任何代码工作,那么当简单的代码可以很好地执行时,您如何知道您需要最快的代码你够了吗?@JonSkeet我身上没有任何代码……如果简单的代码可以正常工作,那么我就可以走了。代码不必太麻烦。
        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();