Regex对重复模式的不同部分进行分组

本文关键字:同部 模式 Regex | 更新日期: 2023-09-27 17:59:02

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

计算采用字符串的形式,我使用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"

这正是我想要的。

Regex对重复模式的不同部分进行分组

有更优雅的方法可以做到这一点,但您总是可以用一个内标识来代替日期中的空格,作为对输入进行预处理的一种方式,然后在处理拆分索引时将替换项换回空格。示例:将(([0-9]{2}/){2}[0-9]{4})( )(([0-9]{2}:){2}[0-9]{2})替换为$1@@SPACE@@$4,然后在空格上拆分字符串,然后在处理每个索引处的拆分字符串时,将@@SPACE@@替换为实际空格,然后继续。