我目前正在为规则引擎项目构建计算解析器工具。
计算采用字符串的形式,我使用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"
这正是我所寻找的。 p>
答案 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[ ]+))