0

我需要将以下字符串拆分为提到的模式

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. )
4

3 回答 3

2

我同意neoistheone的观点,这看起来像是解析器的工作,但是您仍然可以使用像这样的正则表达式

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

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

于 2013-10-14T12:14:17.907 回答
1

与您指定的内容非常匹配,您可以尝试

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

这将匹配

  • 前面的 char 是*, /, (, )or+并且下一个字符存在
  • or 下一个字符是*, /, (, )or+并且前面的字符存在

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

于 2013-10-14T12:15:15.033 回答
1

这在我看来就像你正在尝试解析一个方程......(也许然后与Shunting-yar 算法一起使用:) 所以真的,你想把方程分成 3 类:

  1. 运算符 (*,/,+,- ...)
  2. 操作数 ([myString1 - D]
  3. 括弧

要使用正则表达式,我会谷歌它......有很多资源,但我使用的备忘单是:http: //www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet

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

我上面描述的每个类别都应该是它自己的组。然后你会想把or它们放在一起。

这给了我们:

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

这将返回每个部分的一个匹配项。因此,您只想继续骑自行车,直到没有更多比赛为止。

于 2013-10-14T12:19:01.863 回答