我有一个<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>
提前致谢。
答案 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)
您有两种选择来获取 元素值:
使用正则表达式。
使用XmlReader
或XDocument
:
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];
}
}
如果没有识别出操作数,您将获得'_'
下划线字符。
如果有多个操作员,您将只获得第一个操作员。