我需要将以下字符串拆分为提到的模式
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. )
我同意neoistheone的观点,这看起来像是解析器的工作,但是您仍然可以使用像这样的正则表达式
var str = "([myString1 - L]*[myString2 - L])/([myString3 - D]+[myString4 - N])";
var result = Regex.Split(str, @"(\[[^]]+\]|[/\*\+\(\)])").Where(r => r != "").ToList();
这将为您提供所需的输出(只要您的输入保持简单,例如输入中没有嵌套表达式)。
与您指定的内容非常匹配,您可以尝试
new Regex(@"(?<=[(*/+)])(?=.)|(?<=.)(?=[(*/+)])").Split(str);
这将匹配
*
, /
, (
, )
or+
并且下一个字符存在*
, /
, (
, )
or+
并且前面的字符存在您需要前一个/下一个字符存在检查,否则它将在字符串的开头/结尾拆分。
这在我看来就像你正在尝试解析一个方程......(也许然后与Shunting-yar 算法一起使用:) 所以真的,你想把方程分成 3 类:
要使用正则表达式,我会谷歌它......有很多资源,但我使用的备忘单是:http: //www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet
它具有您想要的大部分操作。
我上面描述的每个类别都应该是它自己的组。然后你会想把or
它们放在一起。
这给了我们:
(<?operator>[\+\-\*\/])|(<?operand>\w\s\-\[LD])|(<?par>[\(\)])
这将返回每个部分的一个匹配项。因此,您只想继续骑自行车,直到没有更多比赛为止。