c#使用狀態機計算一個形如"abc{0}, 123{1}"format字符串裏一共有多少參數

本文使用狀態機方法計算一個字符串中有多少參數

public class StringFormatParamCnt : BaseSolution
    {
        enum CType
        {
            //大括號外
            outC = 0,
            //{
            left,
            //大括號中間
            middle,
            //}
            right,
        }

        public void Test()
        {
            println(ComputeParamCnt("hello"));
            println(ComputeParamCnt("hello {0}"));
            println(ComputeParamCnt("hello {0}{{"));
            println(ComputeParamCnt("hello {{{0}abc12{1} {3}/{4}"));
        }

        public static int ComputeParamCnt(string content)
        {
            var cnt = 0;
            var s = CType.outC;
            for (var i = 0; i < content.Length; i++)
            {
                var c = content[i];
                switch (s)
                {
                    case CType.outC:
                        switch (c)
                        {
                            case '{':
                                s = CType.left;
                                break;
                            case '}':
                                s = CType.right;
                                break;
                        }
                        break;
                    case CType.left:
                        switch (c)
                        {
                            case '{':
                                break;
                            case '}':
                                //{}這樣的當直接展示的內容
                                s = CType.outC;
                                break;
                            default:
                                s = CType.middle;
                                break;
                        }
                        break;
                    case CType.middle:
                        switch (c)
                        {
                            case '{':
                                break;
                            case '}':
                                cnt++;
                                s = CType.right;
                                break;
                            default:
                                //這裏如果出現非數字應報錯
                                break;
                        }
                        break;
                    case CType.right:
                        switch (c)
                        {
                            case '{':
                                s = CType.left;
                                break;
                            case '}':
                                s = CType.outC;
                                break;
                            default:
                                s = CType.outC;
                                break;
                        }
                        break;
                }

            }
            return cnt;
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章