需要使用指定的模式拆分字符串(公式)

时间:2013-10-14 11:57:50

标签: c# .net regex

我需要将以下字符串拆分为上述模式

String str = "([myString1 - L]*[myString2 - L])/([myString3 - D]+[myString4 - N])";

我希望输出如下所示:

1. (
2. [myString1 - L]
3. *
4. [myString2 - L]
5. )
6. /
7. (
8. [myString3 - D]
9. +
10. [myString4 - N]
11. )

3 个答案:

答案 0 :(得分:2)

我同意neoistheone这看起来像是解析器的工作,但是你可以使用正则表达式

var str = "([myString1 - L]*[myString2 - L])/([myString3 - D]+[myString4 - N])";
var result = Regex.Split(str, @"(\[[^]]+\]|[/\*\+\(\)])").Where(r => r != "").ToList();

将为您提供所需的输出(只要输入保持简单,例如输入中没有嵌套表达式)。

答案 1 :(得分:1)

根据您指定的内容进行匹配,您可以尝试

new Regex(@"(?<=[(*/+)])(?=.)|(?<=.)(?=[(*/+)])").Split(str);

这将匹配

  • 前面的字符*/()+,下一个字符存在
  • 或下一个字符为*/()+且前面的字符存在

您需要存在前一个/下一个字符,否则它将在字符串的开头/结尾处分开。

答案 2 :(得分:1)

这让我觉得你正试图解析一个等式......(也许随后用Shunting-yar algorithm :)所以,实际上,你想把这个等式分为3类:

  1. 运营商(*,/,+, - ......)
  2. 操作数([myString1 - D]
  3. 括号
  4. 要使用正则表达式,我会谷歌...有很多资源,但我使用的备忘单是:http://www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet

    它拥有您想要的大部分操作。

    我上面描述的每个类别应该是它自己的组。然后,您需要or他们在一起。

    这给了我们:

    (<?operator>[\+\-\*\/])|(<?operand>\w\s\-\[LD])|(<?par>[\(\)])
    

    这将为每个部分返回一个匹配。所以你只想继续骑自行车,直到你没有更多的比赛。