包含数字、字母、表达式和括号的公式模式

Posted

技术标签:

【中文标题】包含数字、字母、表达式和括号的公式模式【英文标题】:Pattern for formula which contains number, letters ,expressions and brackets 【发布时间】:2019-11-10 07:47:35 【问题描述】:

我正在尝试为以下示例的公式编写正则表达式。

    C=A+B => Output for match will be A, +, B D= C+50 => Output for match will beC, +, 50 E = (A+B)*C -100 => Output for match will be(, A, +, B, ), *, C, -, 100

我尝试了正则表达式

[A-Z(\d*)*+/-]

这个的输出是A, +, 5, 0

但它没有为A+50 提供正确的输出

【问题讨论】:

正则表达式是分析表达式的一个糟糕的选择。还有其他几种更好的工具和技术。您可以先阅读问题上parsing 标签上的信息。 【参考方案1】:

我建议FSM(有限状态机)而不是正则表达式。我们这里有3 状态:

    既不是变量,也不是数字0 在变量1内 号码内2

代码:

private static IEnumerable<string> Parse(string formula) 
  int state = 0;

  StringBuilder buffer = new StringBuilder();

  foreach (var c in formula) 
    if (state == 0)  // neither var nor number
      if (char.IsWhiteSpace(c))
        continue;

      if (char.IsDigit(c)) 
        buffer.Append(c);
        state = 2;
      
      else if (char.IsLetter(c)) 
        buffer.Append(c);
        state = 1;
       
      else 
        yield return c.ToString();
    
    else if (state == 1)  // within variable
      if (char.IsDigit(c) || char.IsLetter(c))
        buffer.Append(c);
      else 
        yield return buffer.ToString();
        buffer.Clear(); 

        state = 0;

        if (!char.IsWhiteSpace(c))
          yield return c.ToString();
      
    
    else if (state == 2)  // within number
      if (char.IsDigit(c))
        buffer.Append(c);
      else if (char.IsLetter(c)) 
        // 123abc we turn into 123 * abc
        yield return buffer.ToString();
        buffer.Clear();

        state = 1; 

        yield return "*";

        buffer.Append(c);
      
      else 
        yield return buffer.ToString();
        buffer.Clear();

        state = 0;

        if (!char.IsWhiteSpace(c))
          yield return c.ToString();
       
    
   

  if (buffer.Length > 0)
    yield return buffer.ToString();

演示:

  string[] tests = new string[] 
    "C=A+B",
    "D= C+50",
    "E = (A+B)*C -100",
  ;

  string result = string.Join(Environment.NewLine, tests
    .Select(test => new 
      formula = test,
      parsed = Parse(test)
        .SkipWhile(term => term != "=") // we don't want "C = " or alike part
        .Skip(1)
    )
    .Select(test => $"test.formula,-20 => string.Join(", ", test.parsed)"));

 Console.Write(result);

结果:

C=A+B                => A, +, B
D= C+50              => C, +, 50
E = (A+B)*C -100     => (, A, +, B, ), *, C, -, 100

【讨论】:

【参考方案2】:

|(或)用于单个项目,例如模式

\d+|\W|\w

翻译成任何数字或任何非字母字符或任何字母字符。

【讨论】:

以上是关于包含数字、字母、表达式和括号的公式模式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式

js正则表达式

markdown数学公式语法

用于匹配 JSON 子字符串某些部分的 Java 正则表达式

LaTeX数学符号大全

求javascript正则表达式,不允许用户输入斜杠尖括号等特殊符号,只允许输入数字,字母,汉字.