亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

包含數字、字母、表達式和括號的公式模式

包含數字、字母、表達式和括號的公式模式

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 關注
  • 172 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號