【问题标题】:Regular expression to validate a mathematical formula用于验证数学公式的正则表达式
【发布时间】:2021-04-30 13:20:56
【问题描述】:

我需要使用正则表达式验证一个字符串,以确认它是否遵循有效的格式。 字符串可以包含数字、运算符、空格、点、左括号、右括号、逗号,这些聚合函数 SUM、MAX、MIN、AVG 和以字母 V 开头的变量。

我发现这个正则表达式 ^[0-9+-/()., ]+$ 这检查 0-9 (数字); '+'; '-'; ''; '/'; '('; ')'; '.'; ','; ' '(空间)。但我无法在其中包含聚合函数和字母 V。

一些有效的输入字符串是

  1. AVG(SUM(1, 2, 3), SUM(4, 5, 6)) * 100
  2. SUM(V1/2,(2+7),3)+(V1+V2)

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您是要确保字符串中只出现有效字符、聚合函数和变量名,还是要检查字符串的格式是否正确(即两边都有一个操作数运算符,括号匹配等...)?
  • 您是否考虑过使用真正的语法/解析器而不是正则表达式?
  • 这不是正则表达式能做的事情,你堆栈推操作符,括号,...
  • 是 ^[A-Za-z0-9+-/()., ]+$ 你在找什么?
  • @DevMJ then V+1SUM((((V1111((((V+ 是有效的,那么?

标签: c# .net regex


【解决方案1】:

来自问题的cmets:

您是否尝试确保字符串中仅出现有效字符、聚合函数和变量名,或者您是否还尝试检查字符串的格式是否正确(即在运算符的任一侧都有一个操作数,括号是否匹配等...)?

- 中号

@D M 我只是想验证有效字符

-DevMJ


由于您只想检查公式是否包含数字、函数、变量等(而不是它是否也可以执行),因此您可以在一组中添加可能性作为备选方案。

一种可能性是模式^(?:\d|\+|\-|\/|\*|\(|\)|\.|\,|AVG|SUM|MAX|MIN|V\d+| )*$ 与您提供的样本相匹配。

Try it out!

解释:

Token Matches
^ Start of a line
(?: Start of the non-capturing group of alternatives
\d A digit (equivalent to [0-9])
\+ The + character
\- The - character
\/ The / character
\* The * character
\( The ( character
\) The ) character
\. The . character
\, The , character
AVG The string AVG
SUM The string SUM
MAX The string MAX
MIN The string MIN
V\d+ The V character followed by one or more digits
A space
) End of the non-capturing group of alternatives
* Any of the alternatives zero or more times
$ End of a line

如 cmets 中所述,如果您还想检查字符串是否可以成功执行,您需要考虑为您的“语言”定义一个 context-free grammar 并使用像 ANTLR 这样的工具来解析字符串使用语法。

【讨论】:

  • 这不会检查括号的正确嵌套
  • OP 在 cmets 中指定表达式的有效性并不重要,只是表达式只包含定义的字符。
【解决方案2】:

由于您只关心有效字符,因此这确实是正则表达式的工作。

一种简单的过滤方法就是在有效字符中添加字母:

^[A-Z0-9+-/()., ]+$

如果您还想允许小写字符,您甚至可以添加a-z

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    相关资源
    最近更新 更多