如何正则表达式拆分表达式以接受十进制数?

Posted

技术标签:

【中文标题】如何正则表达式拆分表达式以接受十进制数?【英文标题】:How to Regex Split an expression to accept decimal number? 【发布时间】:2020-01-28 18:46:41 【问题描述】:

我正在尝试制作一个计算器。我正在使用 Regex.Split() 从表达式中获取数字输入。它适用于非十进制数字,但现在我正在寻找一种方法来获取十进制数字输入。

string mExp = "1.50 + 2.50";
string[] strNum = (Regex.Split(mExp, @"[\D+]"));
num1                = double.Parse(strNum[0]);
num2                = double.Parse(strNum[1]);

【问题讨论】:

【参考方案1】:

您可以更改您的正则表达式以拆分一些空格,然后是算术运算符,然后是空格:

string[] strNum = (Regex.Split(mExp, @"\s*[+/*-]\s*"));
Console.WriteLine(string.Join("\n", strNum));

输出:

1.50
2.50

Demo on rextester

要处理负数,您必须使正则表达式更复杂一些,并为数字添加后向搜索和对数字或- 的前瞻:

string mExp = "-1.50 + 2.50 -3.0 + -1";
string[] strNum = (Regex.Split(mExp, @"(?<=\d)\s*[+*/-]\s*(?=-|\d)"));
Console.WriteLine(string.Join("\n", strNum));

输出:

-1.50
2.50
3.0
-1

Demo on rextester

【讨论】:

如果我也想接受负数呢?【参考方案2】:

您可以使用以下正则表达式来拆分非十进制数和十进制数:

[^\d.]+

Regex Demo

string[] strNum = (Regex.Split(mExp, @"[^\d.]+"));

本质上是说递归地匹配除数字或点字符之外的任何内容,并按该匹配项进行分割。

【讨论】:

以上是关于如何正则表达式拆分表达式以接受十进制数?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式接受命令并拆分命令、参数和参数值

如何使用正则表达式拆分字符串以返回值列表?

如何修改这个正则表达式以在 Django 中接受这个 URL?

如何在 JavaScript 中将长正则表达式拆分为多行?

正则表达式多选结构的顺序

正数范围 18-65 的正则表达式是啥?它必须只接受两位数