为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
料青山看我应如是 2023-05-13 16:16:22
我正在尝试为以下示例编写公式的正则表达式。C=A+B  => Output for match will be {A, +, B}D= C+50 => Output for match will be{C, +, 50}E = (A+B)*C -100 => Output for match will be{(, A, +, B, ), *, C, -, 100}我试过正则表达式[A-Z(\d*)*+/-]这个的输出是{A, +, 5, 0}但它没有给出正确的输出A+50
查看完整描述

2 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

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

  1. 既不是变量,也不是数字0

  2. 变量内 1

  3. 数以内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


查看完整回答
反对 回复 2023-05-13
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

|对单个项目(例如图案)使用(或)

\d+|\W|\w

转换为任何数字或任何非字母字符或任何字母字符。


查看完整回答
反对 回复 2023-05-13
  • 2 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信