Example #1
0
        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;
            }
        }
Example #2
0
        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);
        }