从表达式中获取负数

时间:2013-08-09 18:14:10

标签: c# regex shunting-yard

我正在尝试将字符串表达式上的标记分开。表达式如下所示:

-1-2+-3

这是我正在使用的正则表达式:

[\d\.]+|[-][\d\.]+|\+|\-|\*|\/|\^|\(|\)

这给我带来了这些比赛:

-1
-2
+
-3

我在期待:

-1
-
2
+
-3

任何想法如何区分运营商的负数?

2 个答案:

答案 0 :(得分:3)

也许你可以试试这个;它利用了一个后视:

((?<=\d)[+*\/^()-]|\-?[\d.]+)

我测试了它here

基本上,确保在操作员之前有一个数字来决定匹配什么。因此,如果操作员之前有一个数字,则单独处理操作员,否则,将减号与数字组合。

编辑:将抽屉与抽签分开,以防万一(demo):

((?<=\d)[+*\/^-]|[()]|\-?[\d.]+)

答案 1 :(得分:1)

这种模式应该可以满足您的需求:

^(?:(?<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