正则表达式将重复模式的不同部分组合在一起

时间:2016-07-27 20:12:29

标签: c# regex

我目前正在为规则引擎项目构建计算解析器工具。

计算采用字符串的形式,我使用string.split('')进入值数组,分隔值和运算符:

expression = "5 + 6 - 8"
expression.split(' ');

[0]:5
[1]:+
[2]:6
[3]:-
[4]:8

我的代码使用这个数组来得到答案3 - 目前我只做左右评估并处理运算符优先级。

我希望扩展计算字符串以使用日期 - 从日期时间添加或减去分钟,不幸的是我的DateTime有空格所以我得到了结果:

expression = "12/12/2016 12:00:00 + 30 - 10"
expression.split(' ');

[0]:12/12/2016 
[1]:12:00:00
[2]:+
[3]:30
[4]:-
[5]:10

当我真正想要的时候:

[0]:12/12/2016 12:00:00 
[1]:+
[2]:30
[3]:-
[4]:10

我希望通过正则表达式来解决这个问题,所以我也可以同时验证字符串,但不幸的是我创建它们的知识有限。

有没有人会有一个正则表达式的例子,或者有关我如何才能做到这一点的任何建议 - 让数字和运算符分别存储在一个数组中?或者正则表达式不可能这样做吗?我会更好地使用String.Substring()来取出数据吗?

修改
sln解决方案解决了我的问题,我的最终代码看起来像这样:

var splitExp = Regex.Split(expression, @"[ ](?:(?=\D)|(?<=\D[ ]))");

给出了:

expression = "12/12/2016 12:00:00"
splitExp[0] =  "12/12/2016 12:00:00"

expression = "12/12/2016 12:00:00 + 30 - 10"
splitExp[0] =  "12/12/2016 12:00:00"
splitExp[0] =  "+"
splitExp[0] =  "30"
splitExp[0] =  "-"
splitExp[0] =  "10"

这正是我所寻找的。

2 个答案:

答案 0 :(得分:0)

有更优雅的方法可以执行此操作,但您始终可以将标记替换为日期中的空格,作为预处理输入的方式,然后在处理拆分索引时将替换替换为空格。例: 在将字符串拆分为空格之前将(([0-9]{2}/){2}[0-9]{4})( )(([0-9]{2}:){2}[0-9]{2})替换为$1@@SPACE@@$4,然后在每个索引处理拆分字符串时将@@SPACE@@替换为实际空格,然后再继续。

答案 1 :(得分:-1)

您需要的只是一方或另一方的数字 然后它不会匹配数字空格数字

使用带分割的正则表达式来获得结果

[ ](?:(?=\D)|(?<=\D[ ]))

扩展

 [ ]                      # Space to split on
 (?:                      # Check if space is valid
      (?= \D )                 # Either a non-digit after it
   |                         # or, 
      (?<= \D [ ] )            # A non-digit before it
 )

如果您期望可变数量的空格
把它改成这个 -

(?>[ ]+)(?:(?=\D)|(?<=\D[ ]+))