Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2014, 19:19   #1
meksik
Новичок
Джуниор
 
Регистрация: 03.10.2014
Сообщений: 6
Радость Автоматическая замена кавычек как в Word

Не знаю, насколько избита тема, но по данному вопросу ничего толком не нашел в инете. Предлагаю свою реализацию для тех, кому не все равно какие кавычки пользователь вводит в программу

Написал статичный класс, который в свой единственный метод принимает параметр контрол TextBox. Метод хорошо работает на событии OnTextChanged.

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace QuotesConverter_
{
    static class QuotesConverter
    {
        public static void QuotesReplace(TextBox tb) 
        {
            string str = tb.Text; //Текст TextBox
            int SelectStart = tb.SelectionStart; //Текущая позиция курсора в TextBox
            char[] chars = str.ToCharArray(); //Конверт текста TextBox в символьный массив
            string pattern = "[«» А-Яа-я\"]"; //Шаблон регулярки
            Regex regex = new Regex(pattern); //Создаем регулярку
            MatchCollection matches = regex.Matches(str); //Запускаем поиск по регулярке в символьном массиве 
            if (matches.Count > 0) //Если совпадения найдены вообще
            { 
                for (int ctr = 0; ctr < matches.Count; ctr++) //Циклим массив совпадений
                { 
                    if (!Regex.IsMatch(matches[ctr].Value, "[ А-Яа-я]")) //Проверяем, является ли текущий символ буквой или пробелом, если является, то идем дальше
                    { 
                        if (matches[ctr - 1].Value == " ") //Проверяем, является ли предыдущий символ текущего пробелом, если является, то ...
                        {
                            chars[matches[ctr].Index] = '«'; //Заменяем текущий символ в массиве на открывающую "елочку"
                        }
                        else
                        {
                            chars[matches[ctr].Index] = '»'; //Иначе Заменяем текущий символ в массиве на закрывающую "елочку"
                        }
                    }
                }

                string newstr = String.Empty; //Создаем пустую строку

                foreach (char c in chars)
                {
                    newstr += c; //Записываем в цикле в новую строку посимвольно весь символьный массив
                }
                tb.Text = newstr; //Заменяем текст в TextBox на новую строку
            }
            tb.SelectionStart = SelectStart; //Возвращаем курсор в изначальное положение
        }
    }
}
Пример реализации:

Код:
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            QuotesConverter.QuotesReplace(sender as TextBox);
        }
Надеюсь, что помог хоть кому-то
PS : Поправил шаблон регулярного выражения, была ошибка, не тот вариант кода выложил сначала...

Последний раз редактировалось meksik; 04.10.2014 в 11:06.
meksik вне форума Ответить с цитированием
Старый 03.10.2014, 23:59   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Какая гадость. Откройте для себя Regex.Replace, чтобы не городить такие велосипеды что-ли... или даже банальный string.Replace(" \""," «")
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 04.10.2014, 10:04   #3
meksik
Новичок
Джуниор
 
Регистрация: 03.10.2014
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Какая гадость. Откройте для себя Regex.Replace, чтобы не городить такие велосипеды что-ли... или даже банальный string.Replace(" \""," «")
Про Regex.Replace мне известно, здесь он не уместен, так как здесь не просто тупая замена одной кавычки на другую. Вы логику в Word проследите сначала, как это там делается. Было бы всё так просто, я написал бы одну строку кода.
meksik вне форума Ответить с цитированием
Старый 04.10.2014, 10:14   #4
meksik
Новичок
Джуниор
 
Регистрация: 03.10.2014
Сообщений: 6
По умолчанию

А вообще, если допилисть класс, то он будет в строк 10, я просто выложил сырую версию, чтоб описать в деталях, что к чему.
meksik вне форума Ответить с цитированием
Старый 05.10.2014, 19:57   #5
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
не просто тупая замена одной кавычки на другую
а, ну да. замену комбинации "пробел+кавычка" риплейсом не решить, понимаю... ))))
вот вам экономия еще семи строчек

Код:
int SelectStart = tb.SelectionStart;
tb.Text = tb.Text.Replace(" \""," «").Replace("\"","»");
tb.SelectionStart = SelectStart;
и даже так пересчитывать всё при каждом изменении текста это по меньшей мере глупо.
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматическая замена гиперссылок на текст ekvador Microsoft Office Excel 3 25.11.2013 11:50
Автоматическая замена форматов Safanna Microsoft Office Excel 0 29.04.2011 17:50
Автоматическая замена значений Mr.Jass Microsoft Office Excel 8 23.11.2010 17:20
Автоматическая замена номера на имя Anzor_09 Microsoft Office Excel 3 19.02.2010 11:17
Word. автоматическая замена значений belikk Microsoft Office Word 8 07.03.2009 11:03