我正在尝试分离字符串表达式上的标记。表达式如下:
-1-2+-3
这是我正在使用的正则表达式:
[d.]+|[-][d.]+|+|-|*|/|^|(|)
这给我带来了这些匹配:
-1
-2
+
-3
我期待着:
-1
-
2
+
-3
有什么想法可以把负数和运算符区分开吗?
也许你可以试试这个;它利用了一个背后的视角:
((?<=d)[+*/^()-]|-?[d.]+)
我在这里测试过。
基本上,确保在操作员决定匹配什么之前有一个数字。因此,如果运算符前面有一个数字,请单独处理运算符,否则,将减号与数字组合。
编辑:将括号与批次分开,以防万一(演示):
((?<=d)[+*/^-]|[()]|-?[d.]+)
这个模式应该满足您的需求:
^(?:(?<num>-?[d.]+)(?:(?<op>[-+*/^])|$))+$
例如:
var input = "-1-2+-3";
var pattern = @"^(?:(?<num>-?[d.]+)(?:(?<op>[-+*/^])|$))+$";
var match = Regex.Match(input, pattern);
var results =
from Group g in match.Groups.Cast<Group>().Skip(1)
from Capture c in g.Captures
orderby c.Index
select c.Value;
将产生:
-1
-
2
+
-3