public ReplaceParameter(string replaceFrom, string replaceTo, FindMode mode) { this.ReplaceFrom = replaceFrom; this.ReplaceTo = replaceTo; this.Mode = mode; switch (mode) { case FindMode.Plain: string escapedText = Regex.Escape(this.ReplaceFrom); this.ReplaceFromPattern = new Regex(escapedText, RegexOptions.Compiled); this.ReplaceToPattern = new[] { ExtendReplaceTo.Plain(this.ReplaceTo) }; break; case FindMode.Word: string escapedWord = Regex.Escape(this.ReplaceFrom); escapedText = "\\b" + escapedWord + "\\b"; this.ReplaceFromPattern = new Regex(escapedText, RegexOptions.Compiled); this.ReplaceToPattern = new[] { ExtendReplaceTo.Plain(this.ReplaceTo) }; break; case FindMode.Regex: this.ReplaceFromPattern = new Regex(this.ReplaceFrom, RegexOptions.Compiled); this.ReplaceToPattern = ExtendReplaceTo.Parse(this.ReplaceTo); break; } }
public static List <ExtendReplaceTo> Parse(string replaceTo) { var repto = new List <ExtendReplaceTo>(); var tgc = ChangeCase.None; var buff = new StringBuilder(); var escape = false; for (int i = 0; i < replaceTo.Length; ++i) { char c = replaceTo[i]; if (escape) { escape = false; buff.Append(c); } else { if (c == '\\') { // エスケープか、置換後テキストへの特殊な変換 char c2 = CharAt(replaceTo, i + 1); char c3 = CharAt(replaceTo, i + 2); char c4 = CharAt(replaceTo, i + 3); if (Array.IndexOf(new[] { 'l', 'L', 'u', 'U' }, c2) >= 0 && c3 == '$' && (c4 == '{' || ('0' <= c4 && c4 <= '9'))) { // 置換後テキストへの特殊な変換 switch (c2) { case 'l': tgc = ChangeCase.LowerHead; break; case 'L': tgc = ChangeCase.LowerAll; break; case 'u': tgc = ChangeCase.UpperHead; break; case 'U': tgc = ChangeCase.UpperAll; break; } i += 2; c = c3; } else { // エスケープ escape = true; } } if (c == '$') { // 置換後テキストへの変換 // $後の文字は何か? char c2 = CharAt(replaceTo, i + 1); if (Char.IsDigit(c2)) { // インデックス // 数字ではなくなるインデックスを探す int j = i + 1; do { c2 = CharAt(replaceTo, ++j); }while (Char.IsDigit(c2)); // 置換後テキストが始まる前の固定文字 if (buff.Length != 0) { repto.Add(ExtendReplaceTo.Plain(buff.ToString())); buff.Clear(); } // 置換後テキストが始まる前の固定文字 repto.Add(ExtendReplaceTo.Group( Int32.Parse(replaceTo.Substring(i + 1, j - (i + 1))), tgc)); tgc = ChangeCase.None; i = j - 1; } else if (c2 == '{') { // ラベルかインデックス // '}'を探す int j = i + 1; do { c2 = CharAt(replaceTo, ++j); }while (c2 != '}'); // 置換後テキストが始まる前の固定文字 if (buff.Length != 0) { repto.Add(ExtendReplaceTo.Plain(buff.ToString())); buff.Clear(); } // 置換後テキストが始まる前の固定文字 var holder = replaceTo.Substring(i + 2, j - (i + 2)); int index; if (Int32.TryParse(holder, out index)) { // インデックス repto.Add(ExtendReplaceTo.Group(index, tgc)); } else { // ラベル repto.Add(ExtendReplaceTo.Group(holder, tgc)); } tgc = ChangeCase.None; i = j; } else { // $はただの文字として扱う buff.Append(c); } } else { buff.Append(c); } } } if (buff.Length != 0) { repto.Add(ExtendReplaceTo.Plain(buff.ToString())); buff.Clear(); } return(repto); }