C#中如何拆分数学表达式为数字、运算符及括号(正则实现)
解决数学表达式拆分:提取独立数字、运算符和括号
嘿,这个问题我之前做表达式解析的时候也踩过坑!普通的Split方法会直接丢掉分隔符,常规的Regex.Split又容易把数字和运算符粘成一团(比如把4+当成一个元素),不过用正则的零宽断言就能精准搞定这个需求。
核心思路:用零宽断言在符号前后拆分
我们需要在运算符(+、-、*、/)和括号((、))的前后位置都插入拆分点,但不消耗这些符号本身,这样就能把数字、运算符、括号都拆成独立元素。
对应的正则表达式是:
(?<=[+\-*/()])|(?=[+\-*/()])
简单解释下这个正则的两个部分:
(?<=[+\-*/()]):正向零宽后行断言——当某个位置的前一个字符是运算符或括号时,在这里拆分。(?=[+\-*/()]):正向零宽先行断言——当某个位置的后一个字符是运算符或括号时,在这里拆分。
代码示例(C#)
using System; using System.Text.RegularExpressions; class ExpressionTokenizer { static void Main() { string inputExpression = "4+18/(9-3)"; // 用正则拆分 string[] tokens = Regex.Split(inputExpression, @"(?<=[+\-*/()])|(?=[+\-*/()])"); // 过滤掉拆分后可能出现的空字符串 tokens = Array.FindAll(tokens, token => !string.IsNullOrWhiteSpace(token)); // 输出结果 Console.WriteLine("拆分后的元素:"); foreach (var token in tokens) { Console.WriteLine(token); } } }
运行后输出:
4 + 18 / ( 9 - 3 )
代码示例(Python)
如果用Python处理,逻辑是完全一致的:
import re expression = "4+18/(9-3)" # 正则拆分 tokens = re.split(r'(?<=[+\-*/()])|(?=[+\-*/()])', expression) # 过滤空字符串和空白符 tokens = [token for token in tokens if token.strip()] print("拆分后的元素:") for token in tokens: print(token)
输出结果和C#完全匹配,完美符合你的需求。
额外补充:处理负数的情况
如果你的表达式里包含负数(比如-4+3),上面的正则会把-和4拆成两个独立元素。如果需要把负数当作一个整体,可以调整正则,让负号只有在前面不是数字的时候才触发拆分:
(?<=[+\*/()])|(?=[+\*/()])|(?<![0-9])(?=-)
这样-4+3会被拆成['-4', '+', '3'],适配更多复杂场景。
内容的提问来源于stack exchange,提问作者Birdman
相关产品推荐
相关产品推荐

