C#中用于分离数学和逻辑表达式的正则表达式

3
我尝试使用正则表达式将一个表达式分解成多个部分。目前,我是通过空格来进行分割的,但这并不是正确的方法。以下是一个示例表达式:
var expression = "#X+ 23>=#Threshold && #X * 4 != 54 || #IgnoreCheck"

我需要的结果是所有零件的清单:
["#X", "+", "23", ">=", "#Threshold", "&&", "#X", "*", "4", "!=", "54", "||", "IgnoreCheck"] 

需要考虑拆分的字符:

&& || != + = - * / ^ > < <= >=

1
我认为你应该提供更多关于表达式语法的信息 - 这绝对不是由空格分隔的。 - Fruchtzwerg
@Fruchtzwerg 谢谢您的提示。我已经添加了这些字符。 - Andoni Zubizarreta
1个回答

4

您可以使用

var res = Regex.Split(expression, @"\s*(&&|\|\||<=|>=|!=|[-+=*/^><])\s*");

请参考正则表达式演示。主要思路是使用选择分支(|),因为某些选择分支是多字符字符串。
细节如下:
- \s* - 匹配0个或多个空格。 - (&&|\|\||<=|>=|!=|[-+=*/^><]) - 第1个捕获组,用于将这些部分输出到结果数组中(因此,当与Regex.Split一起使用时,这些部分将被输出到结果数组中)。匹配:
- && - 两个连续的 ampersand(&)。 - | - 或。 - \|\| - 两个连续的 pipe 符号(|)。 - | - 或。 - <= - 一个小于号(<)和等于号(=)。 - | - 或。 - >= - 一个大于号(>)和等于号(=)。 - | - 或。 - != - 一个感叹号(!)和等于号(=)。 - | - 或。 - [-+=*/^><] - 匹配集合中的任意1个字符。
- \s* - 匹配0个或多个空格。
详见enter image description here

程序名称是什么? - Eduardo Lynch Araya
1
@Edulynch: RegexStorm.net - Wiktor Stribiżew
由于 Regex.Split 可能且经常会输出空项,因此可以通过附加 .Where(s => !string.IsNullOrWhiteSpace(s)) 进行过滤。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接