2

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

-1-2+-3

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

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

这给我带来了这些比赛:

-1
-2
+
-3

我期待:

-1
-
2
+
-3

任何想法如何将负数与运营商区分开来?

4

2 回答 2

3

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

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

我在这里测试过。

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

编辑:将括号与批次分开,以防万一(演示):

((?<=\d)[+*\/^-]|[()]|\-?[\d.]+)
于 2013-08-09T18:20:48.163 回答
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 
于 2013-08-09T18:27:47.967 回答