You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:33:24