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; } }
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); } } }
/* * 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); } }
// 汎用コンバータ 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); }
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; } }
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); }
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; } }
/* * 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); } }
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); }
/* * 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); } }
/* * 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); } }
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); } } } }
//埋込用文字列 引数は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); }
/* * 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); } }
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); } }
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; } }
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); }
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); }
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); }
/// <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); }
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); }