С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
meksik
202 / 171 / 67
Регистрация: 04.10.2014
Сообщений: 839
1

Автоматическая замена кавычек по логике Word

04.10.2014, 11:18. Просмотров 758. Ответов 4
Метки нет (Все метки)

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

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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); //Запускаем поиск по регулярке в тексте TextBox
            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; //Возвращаем курсор в изначальное положение
        }
    }
}
Пример реализации:

C#
1
2
3
4
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            QuotesConverter.QuotesReplace(sender as TextBox);
        }
Регулярку можно написать на свой вкус и цвет, я писал для своих нужд. Если допилить, можно сократить код.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2014, 11:18
Ответы с готовыми решениями:

Замена таблиц в Word
Добрый день! Имеется несколько(от 5-8 и более) *.doc и/или *.docx файлов,с...

Замена ключевых слов в word
Нужно сделать подобие отчета, нашла здесь пример с кодом, получилось так: ...

Замена слов по шаблону Word (C#)
Всем добрый вечер! Помогите плз. Есть Ворд файл: Спарвка1.doc. В нем...

Замена слов в документе Word
как сделать?

Нахождение и замена текста в Word
Хочу заменить в документе символ другой строкой. В результате получается так,...

4
XRoy
862 / 712 / 305
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
04.10.2014, 12:35 2
meksik,
Универсальней было бы работать со строчкой, а не с визуальными компонентами.

И тут у вас большой расход ресурсов, используйте StringBuilder, а если еще переписать с Agregate то и красиво получится
C#
1
2
3
4
5
6
7
string newstr = String.Empty; //Создаем пустую строку
 
                foreach (char c in chars)
                {
                    newstr += c; //Записываем в цикле в новую строку посимвольно весь символьный массив
                }
                tb.Text = newstr; //Заменяем текст в TextBox на новую строку
Добавлено через 57 секунд
Хотя у вас тут даже массив символов, у строки есть конструктор который принимает массив символов
0
meksik
202 / 171 / 67
Регистрация: 04.10.2014
Сообщений: 839
04.10.2014, 13:12  [ТС] 3
Цитата Сообщение от XRoy Посмотреть сообщение
meksik,
Универсальней было бы работать со строчкой, а не с визуальными компонентами.
Это да, но я писал под свой проект, поэтому не стал заморачиваться с возвратом строки

Цитата Сообщение от XRoy Посмотреть сообщение
Хотя у вас тут даже массив символов, у строки есть конструктор который принимает массив символов
а вот это хороший совет, спс

Добавлено через 10 минут
Цитата Сообщение от XRoy Посмотреть сообщение
meksik,
Универсальней было бы работать со строчкой, а не с визуальными компонентами.
PS : Фишка при работе с конкретным текстбоксом в том, что внутри метода при событии OnTextChange происходит возврат курсора в изначальное положение, что избавляет нас от допиливания метода вызова события) А дописать класс под возврат строки не проблема так, если уж припрет кого)

Добавлено через 22 минуты
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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
    {
        /// <summary>
        /// Метод для работы напрямую с TextBox
        /// </summary>
        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); //Запускаем поиск по регулярке в текста TextBox
            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] = '»'; //Иначе заменяем текущий символ в массиве на закрывающую "елочку"
                        }
                    }
                }
                str = new string(chars); //Переписываем начальную строку
                tb.Text = str; //Заменяем текст в TextBox на новую строку
            }
            tb.SelectionStart = SelectStart; //Возвращаем курсор в изначальное положение
        }
 
        /// <summary>
        /// Метод для работы со строкой. Возвращает отредактированную строку
        /// </summary>
        public static string QuotesReplaceToString(string str)
        {
            char[] chars = str.ToCharArray(); //Конверт строки в символьный массив
            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] = '»'; //Иначе заменяем текущий символ в массиве на закрывающую "елочку"
                        }
                    }
                }
                str = new string(chars); //Переписываем начальную строку
            }
            return str;
        }
    }
}
Допилил
0
XRoy
862 / 712 / 305
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
04.10.2014, 14:53 4
Лучший ответ Сообщение было отмечено meksik как решение

Решение

meksik,
Надо выделять общее, QuotesReplace можно переписать так
C#
1
2
3
4
5
6
7
8
9
        public static void QuotesReplace(TextBox tb)
        {
            string str = tb.Text; //Текст TextBox
            int SelectStart = tb.SelectionStart; //Текущая позиция курсора в TextBox
            
            tb.Text = QuotesReplaceToString(str);
 
            tb.SelectionStart = SelectStart; //Возвращаем курсор в изначальное положение
        }
1
meksik
202 / 171 / 67
Регистрация: 04.10.2014
Сообщений: 839
04.10.2014, 14:56  [ТС] 5
Цитата Сообщение от XRoy Посмотреть сообщение
meksik,
Надо выделять общее, QuotesReplace можно переписать так
действительно, я как то не подумал обобщить, набросал просто два варианта и не попытался объединить, спс
0
04.10.2014, 14:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2014, 14:56

Некорректно производится замена в документе Word
Вот так работает: wordSearchReplace(&quot;папа&quot;, &quot;мама&quot;, ref wordApp,...

Interop.Word, замена ключевых слов в документе
Здравствуйте. VisualStudio 2008, Office 2007, никак не могу реализовать замену...

Как сделать чтобы замена текста в WORD производилась по всему документу
Сделал программу для выгрузки текста в шаблон Word с переменными. Как сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru