Пример #1
0
    void is_regex_contents2_lc()
    {
        var match = RegexUtil.Get1stMatch(G.REGEXCONT2, m_line);

        if (!string.IsNullOrEmpty(match))
        {
            //1 正規表現部分の取得
            var regex = RegexUtil.Get1stMatch(@"\$\/.+\/->#", match); // $/正規表現/->#
            regex = regex.Substring(2);
            regex = regex.Substring(0, regex.Length - 4);

            //マクロ名の取得
            var macroname = RegexUtil.Get1stMatch(@"#.+\$$", match);  // #macro$
            macroname = macroname.TrimEnd('$');

            var macrobuf = G.getMacroValueFunc(macroname);
            if (string.IsNullOrEmpty(macrobuf))
            {
                throw new SystemException("Macro is not defined. : " + macroname);
            }
            var c = create_regex_contents(regex, macrobuf);

            var tmplines = StringUtil.ReplaceWordsInLine(m_line, match, c);
            m_resultlist.AddRange(tmplines);
            m_bContinue = true;
        }
    }
Пример #2
0
        private void _init()
        {
            state_list     = new List <string>();
            state_col_list = new List <int>();

            name_list     = new List <string>();
            name_row_list = new List <int>();

            for (var c = 1; c < 10000; c++)
            {
                var state = getChartFunc(STATE_ROW, c);
                if (!string.IsNullOrEmpty(state))
                {
                    if (RegexUtil.Get1stMatch(@"^[a-zA-Z_][a-zA-Z_0-9]*$", state) == state)
                    {
                        state_list.Add(state);
                        state_col_list.Add(c);
                    }
                }
            }

            for (var r = 1; r < 10000; r++)
            {
                var name = getChartFunc(r, NAME_COL);
                if (!string.IsNullOrEmpty(name))
                {
                    name_list.Add(name);
                    name_row_list.Add(r);
                }
            }
        }
Пример #3
0
 /*
  *  S_EXEC_REGEX
  *  正規表現の実行
  */
 void S_EXEC_REGEX(bool bFirst)
 {
     //
     if (bFirst)
     {
         if (m_regex[0] == '/' && m_regex[m_regex.Length - 1] == '/')
         {
             m_regex = m_regex.Substring(1);
             m_regex = m_regex.Substring(0, m_regex.Length - 1);
             var match = RegexUtil.Get1stMatch(m_regex, m_val);
             m_bValid = !string.IsNullOrEmpty(match);
         }
         else
         {
             m_bValid = false;
             throw new SystemException("{59858294-6BCF-45B6-B441-076A5A6041D8}\n" + m_line0);
         }
     }
     // branch
     if (m_bValid)
     {
         Goto(S_GET_SIZE);
     }
     else
     {
         Goto(S_REMOVE);
     }
 }
Пример #4
0
        // 汎用コンバータ
        public static string Convert(string text, int num, List <string> args, bool bAcceptNullArg = false)
        {
            var src = text;

            for (var loop = 0; loop <= 100; loop++)
            {
                if (loop == 100)
                {
                    throw new SystemException("Unexpected! {710FA2E8-7740-43F9-8A26-703AF71085C6}\n" + src + " #" + num.ToString());
                }

                var match = RegexUtil.Get1stMatch(m_argpattern, src);
                if (!string.IsNullOrEmpty(match))
                {
                    var val = GetArgValue(match, args, bAcceptNullArg);
                    src = src.Replace(match, val);
                    continue;
                }
                match = RegexUtil.Get1stMatch(m_numpattern, src);
                if (!string.IsNullOrEmpty(match))
                {
                    var val = num.ToString();
                    src = src.Replace(match, val);
                    continue;
                }

                break;
            }
            return(src);
        }
Пример #5
0
    void is_contents_1_lc()
    {
#if obs
        if (m_line.Contains(G.CONTENTS1))
        {
            var tmplines = StringUtil.ReplaceWordsInLine(m_line, G.CONTENTS1, m_contents1);
            m_resultlist.AddRange(tmplines);
            m_bContinue = true;
        }
#endif
        var match = RegexUtil.Get1stMatch(G.CONTENTS1PTN, m_line);
        if (!string.IsNullOrEmpty(match))
        {
            var macro = string.Empty;
            if (match.Contains("->@"))
            {
                var index = match.IndexOf("->@");
                if (index >= 0)
                {
                    macro = match.Substring(index + 3).Trim('$');
                }
            }
            var replacevalue = G.get_line_macro_value(macro, m_contents1);
            var tmplines     = StringUtil.ReplaceWordsInLine(m_line, match, replacevalue);
            m_resultlist.AddRange(tmplines);
            m_bContinue = true;
        }
    }
Пример #6
0
        public bool createFunc_prepare_obs(string state, ref List <string> lines)
        {
            if (lines == null)
            {
                return(false);
            }

            var findindex   = -1;
            var targetlines = StringUtil.FindMatchedLines(lines, "<<<?", ">>>", out findindex);

            if (targetlines == null)
            {
                return(false);
            }
            if (targetlines.Count < 2)
            {
                throw new SystemException("Unexpected! {A6446D1F-DFD0-4A63-93C7-299265119AC7}");
            }

            //存在を確認して、残すか消す

            var line0      = targetlines[0];
            var targetname = RegexUtil.Get1stMatch(@"(?!\<\<\<\?)(\w+)", line0);

            if (isExist(state, targetname))
            {
                var size = targetlines.Count;

                //最終行が EOF>>>か?
                bool bEOF = (targetlines[targetlines.Count - 1].ToLower().Contains("eof>>>"));

                //先頭行と最終行の削除
                targetlines.RemoveAt(0);
                targetlines.RemoveAt(targetlines.Count - 1);

                if (bEOF) //以降を削除
                {
                    while (lines.Count > findindex + 1)
                    {
                        lines.RemoveAt(lines.Count - 1);
                    }
                    size = 1;
                }
                //変換したものに入れ替え
                lines = StringUtil.ReplaceLines(lines, findindex, size, targetlines);
                return(true);
            }
            else
            {
                lines.RemoveRange(findindex, targetlines.Count);
            }
            return(true);
        }
Пример #7
0
    void is_regex_contents_lc()
    {
        var match = RegexUtil.Get1stMatch(G.REGEXCONT, m_line);

        if (!string.IsNullOrEmpty(match))
        {
            var regex = match.Trim().Substring(2);        //"$/"を除去
            regex = regex.Substring(0, regex.Length - 2); // 行末の "/$"を除去
            var c        = create_regex_contents(regex);
            var tmplines = StringUtil.ReplaceWordsInLine(m_line, match, c);
            m_resultlist.AddRange(tmplines);
            m_bContinue = true;
        }
    }
Пример #8
0
 /*
  *  S_TARGET
  *  <<<?のターゲットを取得
  */
 void S_TARGET(bool bFirst)
 {
     //
     if (bFirst)
     {
         m_target = RegexUtil.Get1stMatch(@"\<\<\<\?.+\s*$", m_line0);
         m_target = m_target.Substring(4).Trim(); // <<<?を削除
     }
     //
     if (!HasNextState())
     {
         Goto(S_USE_NEWWAY);
     }
 }
Пример #9
0
    public static List <string> SplitComma(string i) //カンマ区切りで分割 ダブルクォート対応 \"対応
    {
        if (string.IsNullOrEmpty(i))
        {
            return(null);
        }

        var s = i.Trim();

        if (string.IsNullOrEmpty(s))
        {
            return(null);
        }

        var dw = @"\x22((\x5c\x22)|([^\x22]))*?\x22"; // DQに囲まれた文字列 ¥”対応

        var p1    = @"[^\x22]+?\x2c";                 // "以外が続き 最後が , (カンマ)
        var p2    = @"[^\x22]+?$";                    // "以外が続き 最後が 行末
        var p3    = dw + @"\s*\x2c";                  //  文字列で最後が,
        var p4    = dw + @"\s*$";                     //  文字列で最後が 行末
        var regex = string.Format("^(({0})|({1})|({2})|({3}))", p1, p2, p3, p4);

        var tb   = s;
        var list = new List <string>();

        for (var loop = 0; loop <= 100; loop++)
        {
            if (loop == 100)
            {
                throw new SystemException("Unexpected! {11529044-AA98-47BC-9B8B-A7D2B5322265}");
            }
            var f = RegexUtil.Get1stMatch(regex, tb);
            if (!string.IsNullOrEmpty(f))
            {
                var f2 = f.Trim(',').Trim();
                list.Add(f2);
                tb = tb.Substring(f.Length);
            }
            else
            {
                break;
            }
        }

        if (list.Count > 0)
        {
            return(list);
        }
        return(null);
    }
Пример #10
0
 /*
  *  S_STR_W_REGEX1
  *  <<<?"文字列"/正規表現/
  *   base state : S_STR_W_REGEX
  */
 void S_STR_W_REGEX1(bool bFirst)
 {
     //
     if (bFirst)
     {
         var dqw = RegexUtil.Get1stMatch(@"\x22.*\x22", m_target);
         m_val   = dqw.Trim('\x22');
         m_regex = m_target.Substring(dqw.Length);
     }
     //
     if (!HasNextState())
     {
         Goto(S_NORMALIZE_REGEX);
     }
 }
Пример #11
0
 /*
  *  S_ITEM_W_REGEX1
  *  <<<?itemname/正規表現/
  *   base state : S_ITEM_W_REGEX
  */
 void S_ITEM_W_REGEX1(bool bFirst)
 {
     //
     if (bFirst)
     {
         m_itemname = RegexUtil.Get1stMatch(@"[0-9a-zA-Z_\-]+", m_target);
         m_regex    = m_target.Substring(m_itemname.Length);
         m_val      = m_parent.getString2(m_state, m_itemname);
     }
     //
     if (!HasNextState())
     {
         Goto(S_NORMALIZE_REGEX);
     }
 }
Пример #12
0
 void br_BUT05(Action <bool> st)
 {
     if (!HasNextState())
     {
         var cur = MainStateEvent.Cur();
         if (cur != null && cur.id == MainStateEventId.BUTTON)
         {
             var s = RegexUtil.Get1stMatch(@"\/[^\/]+?$", cur.name);
             UnityEngine.Debug.Log(s);
             if (s == "/BUT05")
             {
                 SetNextState(st);
             }
         }
     }
 }
Пример #13
0
        //埋込用文字列    引数はargpatternで取得した文字列
        //public string GetArgValue(string argstr, bool bAcceptNullArg = false)
        //{
        //    return GetArgValue(argstr, m_args, bAcceptNullArg);
        //}

        // 別からも利用できるように static化
        public static string GetArgValue(string argstr, List <string> args, bool bAcceptNullArg = false)
        {
            if (args == null)
            {
                return("<!!" + argstr.Replace("{%", "//").Trim('<', '>') + "(error:no args in macro)!!>");           //変換できず。
            }
            if (!RegexUtil.IsMatch(m_argpattern, argstr))
            {
                throw new SystemException("Unexpected! {0A4A6F44-838E-44D4-8CCA-873C26573E6B}");
            }
            var numstr = RegexUtil.Get1stMatch(@"\d+", argstr);
            var num    = int.Parse(numstr);
            var bDqOff = argstr.Contains("~");

            var v = string.Empty;

            if (bAcceptNullArg)
            {
                if (num < args.Count)
                {
                    v = args[num];
                }
            }
            else
            {
                if (num >= args.Count)
                {
                    return("<!!" + argstr.Replace("{%", "//").Trim('<', '>') + "(error: arg num is grater than args count)!!>");                //変換できず
                }
                v = args[num];
            }

            if (bDqOff)
            {
                v = v.Trim('\"');
            }
            if (!bAcceptNullArg && string.IsNullOrEmpty(v))
            {
                v = "<!!" + argstr.Replace("{%", "//").Trim('<', '>') + "(error: arg is null)!!>";
            }
            return(v);
        }
Пример #14
0
 /*
  *  S_EXTRUCT
  *  抽出
  */
 void S_EXTRUCT(bool bFirst)
 {
     //
     if (bFirst)
     {
         if (string.IsNullOrEmpty(m_regex) || string.IsNullOrEmpty(m_val))
         {
             m_exstr = m_val;
         }
         else
         {
             m_exstr = RegexUtil.Get1stMatch(m_regex, m_val);
         }
     }
     //
     if (!HasNextState())
     {
         Goto(S_CHECK_EQSTR);
     }
 }
Пример #15
0
 string m_exstr; //抽出結果用
 void S_CHECK_EQUALS(bool bFirst)
 {
     //
     if (bFirst)
     {
         m_exstr = null; //結果クリア
         // 抽出 =="hoge"
         var s = RegexUtil.Get1stMatch(@"==\x22[^\x22]*?\x22$", m_target);
         if (!string.IsNullOrEmpty(s))
         {
             m_eqstr  = s.Substring(2).Trim('\x22');
             m_target = m_target.Substring(0, m_target.Length - s.Length);
         }
     }
     //
     if (!HasNextState())
     {
         Goto(S_CHECK_BOT1);
     }
 }
Пример #16
0
    void get_param(string s)
    {
        var markindex = s.IndexOf(MARK_START);
        var ns        = s.Substring(markindex + MARK_START.Length); //マークより後のバッファ

        var indentstr = RegexUtil.Get1stMatch(@"indent\(\d+\)", ns);

        if (!string.IsNullOrEmpty(indentstr))
        {
            var numstr = RegexUtil.Get1stMatch(@"\d+", indentstr);
            m_indent = int.Parse(numstr);

            ns = ns.Replace(indentstr, ""); //インデント部分除去
        }

        m_command = RegexUtil.Get1stMatch(@"\$.+\$\s*$", ns);

        if (string.IsNullOrEmpty(m_command))
        {
            m_error = "Cannot find command : " + s;
        }
    }
Пример #17
0
    string create_regex_contents(string regex, string macrobuf = null)
    {
        var state_list = new List <string>();

        G.state_list.ForEach(i => {
            var a = RegexUtil.Get1stMatch(regex, i);
            if (!string.IsNullOrEmpty(a))
            {
                state_list.Add(i);
            }
        });
        state_list.Sort();
        var s = string.Empty;

        foreach (var state in state_list)
        {
            var o = G.CreateFuncInternal(state, macrobuf);
            if (!string.IsNullOrEmpty(o))
            {
                s += o + G.NEWLINECHAR;
            }
        }
        return(s);
    }
Пример #18
0
        public bool createFunc_prepare_obs2(string state, ref List <string> lines)
        {
            if (lines == null)
            {
                return(false);
            }

            var findindex   = -1;
            var targetlines = StringUtil.FindMatchedLines2(lines, "<<<?", ">>>", out findindex);

            if (targetlines == null)
            {
                return(false);
            }
            if (targetlines.Count < 2)
            {
                throw new SystemException("Unexpected! {A6446D1F-DFD0-4A63-93C7-299265119AC7}");
            }

            //存在を確認して、残すか消す

            var line0    = targetlines[0];
            var bValid   = false;
            var itemname = string.Empty;
            var val      = string.Empty;
            var regex    = string.Empty;
            var target   = RegexUtil.Get1stMatch(@"\<\<\<\?.+\s*$", line0);

            target = target.Substring(4).Trim(); // <<<?を削除
            if (target[0] == '\"')               //  <<<?"文字列"/正規表現/
            {
                var dqw = RegexUtil.Get1stMatch(@"\x22.*\x22", target);
                val   = dqw.Trim('\x22');
                regex = target.Substring(dqw.Length);
            }
            else
            { //  <<<?itemname    または  <<<?itemname/正規表現/
                itemname = RegexUtil.Get1stMatch(@"[0-9a-zA-Z_\-]+", target);
                regex    = target.Substring(itemname.Length);
                val      = getString2(state, itemname);
            }

            bValid = !string.IsNullOrEmpty(val);

            if (!string.IsNullOrEmpty(regex) && regex.Length > 2)
            {
                if (regex[0] == '/' && regex[regex.Length - 1] == '/')
                {
                    regex = regex.Substring(1);
                    regex = regex.Substring(0, regex.Length - 1);

                    var match = RegexUtil.Get1stMatch(regex, val);
                    bValid = !string.IsNullOrEmpty(match);
                }
                else
                {
                    bValid = false;
                    throw new SystemException("Unexpected! {9280C652-054F-46D2-9340-BC281A2299A7} \n" + line0);
                }
            }

            if (bValid)
            {
                var size = targetlines.Count;

                //最終行が EOF>>>か?
                bool bEOF = (targetlines[targetlines.Count - 1].ToLower().Contains("eof>>>"));

                //先頭行と最終行の削除
                targetlines.RemoveAt(0);
                targetlines.RemoveAt(targetlines.Count - 1);

                if (bEOF) //以降を削除
                {
                    while (lines.Count > findindex + 1)
                    {
                        lines.RemoveAt(lines.Count - 1);
                    }
                    size = 1;
                }
                //変換したものに入れ替え
                lines = StringUtil.ReplaceLines(lines, findindex, size, targetlines);
                return(true);
            }
            else
            {
                lines.RemoveRange(findindex, targetlines.Count);
            }
            return(true);
        }
Пример #19
0
        public bool CheckMacro(string buf)
        {
            string match = RegexUtil.Get1stMatch(m_includepattern, buf); // $include

            if (!string.IsNullOrEmpty(match))
            {
                m_bValid   = true;
                m_bInclude = true;
                m_matchstr = match;

                analyze_include();
            }
            if (!m_bValid)
            {
                match = RegexUtil.Get1stMatch(m_lcOrUcPattern, buf); // $lc:xxx$ or $uc:xxxx$
                if (!string.IsNullOrEmpty(match))
                {
                    m_bValid   = true;
                    m_blcOrUc  = true;
                    m_matchstr = match;

                    analyze_lcOrUc();
                }
            }
            if (!m_bValid)
            {
                match = RegexUtil.Get1stMatch(m_prefixpattern, buf);
                if (!string.IsNullOrEmpty(match))
                {
                    m_bValid   = true;
                    m_bPrefix  = true;
                    m_matchstr = match;
                }
            }
            if (!m_bValid)
            {
                match = RegexUtil.Get1stMatch(m_statemachinepattern, buf); // ママ
                if (!string.IsNullOrEmpty(match))
                {
                    m_bValid        = true;
                    m_bStatemachine = true;
                    m_matchstr      = match;
                }
            }
            if (!m_bValid)
            {
                match = RegexUtil.Get1stMatch(m_state_machinepattern, buf); //スネーク型
                if (!string.IsNullOrEmpty(match))
                {
                    m_bValid          = true;
                    m_b_state_machine = true;
                    m_matchstr        = match;
                }
            }
            if (!m_bValid)
            {
                match = RegexUtil.Get1stMatch(m_stateMachinePattern, buf); // lower Camel型
                if (!string.IsNullOrEmpty(match))
                {
                    m_bValid         = true;
                    m_b_stateMachine = true;
                    m_matchstr       = match;
                }
            }
            if (!m_bValid)
            {
                match = RegexUtil.Get1stMatch(m_StateMachinePattern, buf); // Upper Camel型
                if (!string.IsNullOrEmpty(match))
                {
                    m_bValid         = true;
                    m_b_StateMachine = true;
                    m_matchstr       = match;
                }
            }
            if (!m_bValid)
            {
                match = RegexUtil.Get1stMatch(m_macropattern, buf);
                if (!string.IsNullOrEmpty(match))
                {
                    m_bValid   = true;
                    m_bInclude = false;
                    m_matchstr = match;

                    analyze_macro();
                }
            }
            return(m_bValid);
        }
Пример #20
0
    /// <summary>
    /// 文字列中の対象文字を代替文字に入れ替える
    /// ※代替文字に改行が含まれていた場合、見栄えを調整する。この場合に複数行になる
    /// </summary>
    public static List <string> ReplaceWordsInLine(string line, string target, string replace, bool bTrimEnd = true)
    {
        if (string.IsNullOrEmpty(line))
        {
            throw new SystemException("Unexpected! {8F041B67-5F7C-4159-83BC-A0A20858C242}");
        }
        if (string.IsNullOrEmpty(target))
        {
            throw new SystemException("Unexpected! {475F3A7E-03A0-4AE0-94AD-8668BDA5B217}");
        }
        if (target.Trim() != target)
        {
            throw new SystemException("Unexpected! {BC4E8F0B-5DAA-4ED5-9E75-98134929CF0B}");
        }
        if (!line.Contains(target))
        {
            throw new SystemException("Unexpected! {D5C8183F-D166-4C6E-AB6B-2E7FD7155696}");
        }

        var replace2 = string.Empty;

        if (!string.IsNullOrEmpty(replace))
        {
            replace2 = replace.Trim();
        }
        var newline = StringUtil.FindNewLineChar(replace2);

        if (newline == null) //1行
        {
            var tmp = line.Replace(target, replace2);
            return(new List <string>()
            {
                tmp
            });
        }

        /*
         *  複数行
         *  if ([[hoge]]){ return; }
         *    v
         *    v
         *  if (
         *      hoge1
         *      hoge2
         *       :
         *              ){ return; }
         *
         *
         */
        List <string> replines    = bTrimEnd ?   StringUtil.SplitTrimEnd(replace2, '\x0a') : StringUtil.SplitTrim(replace2, '\x0a');
        var           firstspace  = RegexUtil.Get1stMatch(@"^\s", line);
        var           targetindex = line.IndexOf(target);

        var result = new List <string>();

        //1. 第一行:ターゲット手前まで
        {
            var buf = line.Substring(0, targetindex);
            result.Add(buf);
        }
        //2. 代替文字列 先頭に "firstspace" と (targetindex - firstspace.length)分のスペース
        foreach (var r in replines)
        {
            var buf = string.Empty;
            if (firstspace != null)
            {
                buf += firstspace + new string(' ', targetindex - firstspace.Length);
            }
            else
            {
                buf += new string(' ', targetindex);
            }
            buf += r;
            result.Add(buf);
        }
        //3. 最終行:代替文字列と同様の空白、その後にlineのターゲット文字以降を挿入
        {
            var buf = string.Empty;
            if (firstspace != null)
            {
                buf += firstspace + new string(' ', targetindex + target.Length - firstspace.Length);
            }
            else
            {
                buf += new string(' ', targetindex + target.Length);
            }
            buf += line.Substring(targetindex + target.Length);
            result.Add(buf);
        }
        return(result);
    }
Пример #21
0
        public bool createFunc_work(string state, ref List <string> lines)
        {
            if (lines == null)
            {
                return(false);
            }

            for (var i = 0; i < lines.Count; i++)
            {
                var tstate      = state;
                var line        = lines[i];
                var targetvalue = RegexUtil.Get1stMatch(@"\[\[.*?\]\]", line);
                if (string.IsNullOrEmpty(targetvalue))
                {
                    continue;
                }
                var tmp_targetvalue = targetvalue;
                // ::STATE_NAMEの取得
                if (tmp_targetvalue.StartsWith("[[::"))
                {
                    tstate = RegexUtil.Get1stMatch(@"^" + RegexUtil.VARNAME_PATTERN, tmp_targetvalue.Substring(4));
                    if (string.IsNullOrEmpty(tstate))
                    {
                        continue;
                    }

                    tmp_targetvalue = tmp_targetvalue.Substring(4);
                    if (string.IsNullOrEmpty(tmp_targetvalue))
                    {
                        continue;
                    }
                    tmp_targetvalue = tmp_targetvalue.Substring(tstate.Length);
                    if (string.IsNullOrEmpty(tmp_targetvalue))
                    {
                        continue;
                    }
                    if (tmp_targetvalue[0] != ':') // [[::STATE:ITEM]]となるのが正しい
                    {
                        continue;
                    }
                    tmp_targetvalue = tmp_targetvalue.Substring(1);
                    tmp_targetvalue = "[[" + tmp_targetvalue; //以降が期待する [[item]]の形
                }

                var name      = RegexUtil.Get1stMatch(@"[\!0-9a-zA-Z_\-]+", tmp_targetvalue);
                var macroname = string.Empty;
                var linenum   = -1;
                var argnum    = -1;
                var num_colon = StringUtil.CountChar(tmp_targetvalue, ':');
                if (num_colon >= 1)
                {
                    try {
                        var linenumstr = RegexUtil.GetNthMatch(@":\d+", tmp_targetvalue, 1);
                        linenumstr = linenumstr.Substring(1);
                        linenum    = int.Parse(linenumstr);
                    } catch (SystemException e)
                    {
                        throw new SystemException("Unpexected! {09F04A64-E5DE-4692-8784-1D0A493715D7} " + e.Message + "\n" + line);
                    }
                }
                if (num_colon >= 2)
                {
                    try {
                        var argnumstr = RegexUtil.GetNthMatch(@":\d+", tmp_targetvalue, 2);
                        argnumstr = argnumstr.Substring(1);
                        argnum    = int.Parse(argnumstr);
                    } catch (SystemException e)
                    {
                        throw new SystemException("Unpexected! {68DE5327-ECE6-4241-A2E3-CF9F87C9F5F1} " + e.Message + "\n" + line);
                    }
                }
                bool?b_loweCamel_or_upper = null;
                if (tmp_targetvalue.Contains(">>lc"))
                {
                    b_loweCamel_or_upper = true;
                }
                if (tmp_targetvalue.Contains(">>uc"))
                {
                    b_loweCamel_or_upper = false;
                }
                macroname = name;
                if (tmp_targetvalue.Contains("->@"))
                {
                    macroname = RegexUtil.Get1stMatch(@"->@.+?]", tmp_targetvalue);
                    macroname = macroname.Substring(3);
                    macroname = macroname.Substring(0, macroname.Length - 1);
                    if (argnum != -1)
                    {
                        throw new SystemException("Macro cannot use with argnument number. { 68DE5327 - ECE6 - 4241 - A2E3 - CF9F87C9F5F1 } \n" + line);
                    }

                    {//nameの語尾に - があるケースがあった。targetvalueの ->のインデックスまではnameとする。
                        var s       = (string)tmp_targetvalue;
                        var idx     = s.IndexOf("->@");
                        var newname = s.Substring(0, idx);
                        name = newname.TrimStart('[');
                    }
                }
                if (string.IsNullOrEmpty(name))
                {
                    continue;
                }
                var val = getString2(tstate, name);
                if (!string.IsNullOrEmpty(val) && linenum >= 0)
                {
                    var tmplines = StringUtil.SplitTrimEnd(val, StringUtil._0a[0]);
                    val = linenum < tmplines.Count ? tmplines[linenum] : string.Empty;
                }
                if (!string.IsNullOrEmpty(val) && argnum >= 0)
                {
                    var args = StringUtil.SplittComma_And_ApiArges(val);
                    val = argnum < args.Count ? args[argnum] : string.Empty;
                }
                if (b_loweCamel_or_upper != null)
                {
                    var upper_or_lower = !((bool)b_loweCamel_or_upper);
                    val = StringUtil.convert_to_camel_word(val, upper_or_lower);
                }

                if (name == "brcond") //コンディションの改行対応
                {
                    if (!string.IsNullOrEmpty(val))
                    {
                        if (!string.IsNullOrEmpty(BRANCHEDIT_NEWLINECHAR))
                        {
                            val = val.Replace(BRANCHEDIT_NEWLINECHAR, Environment.NewLine);
                        }
                    }
                }

                var replacevalue  = val;
                var replacevalue3 = get_line_macro_value(macroname, replacevalue); // @stateマクロがあれば、各行に適用する

                var tmplines2 = StringUtil.ReplaceWordsInLine(line, targetvalue, replacevalue3);

                lines.RemoveAt(i);
                lines.InsertRange(i, tmplines2);
                return(true);
            }
            return(false);
        }