вівторок, 14 лютого 2017 р.

Пошук слів та виділення кольором

Це відео буде доволі насиченим. Головна мета – це змусити програму шукати певні слова у тексті, але крім цього ми розглянемо створення масивів, виділення кольором у тексті, а також познайомимося з регулярними виразами. Отож, почнемо.

Усім нам відома програма «Word», у якій функція пошуку реалізована доволі зручно. Наприклад, текст, який необхідно знайти, виділяється на сторінках жовтим кольором. Ми спробуємо це відтворити.
Вибираємо шаблон «Застосунки Windows Forms», вводимо ім’я нашого проекту (наприклад, «TextEditor») та натискаємо на кнопку «окей».
Нам знадобляться 3 графічні елементи керування: по-перше, кнопка (Button); по-друге, текстове поле, куди користувач буде вводити слова, які необхідно знайти; і по-третє, RichTextBox, в якому буде міститися сам текст.
Одразу слід зазначити, що ми дозволимо користувачу шукати як одне слово, так і декілька. Наприклад, користувач введе два слова для пошуку, розділені комою без пробілу. Щоб шукати кожне з цих слів, необхідно створити масив рядків, в якому кожному рядку відповідатиме одне слово для пошуку.
Тепер почнемо власне програмувати. Натискаємо двічі на кнопку.
Щоб створити масив рядків необхідно ввести тип змінної – «string», а потім поставити квадратні дужки. Тепер вводимо назву масиву і присвоюємо йому значення, в даному випадку – «textBox1.Text». Щоб поділити суцільний рядок на слова, необхідно використати метод Split. Відкриваємо дужку. Тепер необхідно вказати масив символів, які розділяють слова. Оскільки рядок буде поділено на слова лише один раз, то немає необхідності створювати окремий масив символів. Тому введемо ключове слово «new» та тип змінної «char», тобто символ. Відкриваємо-закриваємо квадратні дужки, щоб показати що це масив. Щоб одразу задати значення у масиві, запишемо їх у фігурних дужках (а точніше його, оскільки нам потрібна буде лише кома). Символи, на відміну від рядків, слід записувати не у лапках, а між двома апострофами. Закриваємо фігурну дужку. Ми б могли зараз закрити дужку і поставити крапку з комою, але ми поставимо кому і надрукуємо «StringSplitOptions.RemoveEmptyEntries». Це потрібно для того, щоб прибрати пусті елементи з масиву. Справа в тому, що користувач може ввести дві коми підряд, і тоді програма дарма виконає зайву послідовність подій.

Слова мають бути розділені комою без пробілу

Так виглядає введення необхідних слів для пошуку. Потім користувач має натиснути на кнопку. Втім, візуально ще нічого не відбувається. Повернімося до коду.
Щоб пошук, який буде реалізовано пізніше, не починався щоразу з початку, треба запам’ятати позицію, з якої слід починати пошук. Тому створимо числову змінну «pos» (тобто позиція) = 0.
Оскільки програма виділятиме знайдені слова кольором, перед цим необхідно прибрати кольорове виділення, що могло вже бути в тексті до натиску на кнопку. Спочатку виділимо весь текст: «richTextBox1.SelectAll();» Після цього змінити колір фону виділеного тексту на білий. «richTextBox1.SelectionBackColor». Присвоїмо колір із колекції кольорів Color: «Color.White», який є стандартним кольором фону.
Тепер необхідно створити цикл, який виконається стільки разів, скільки є слів для пошуку. Вводимо: «foreach (string word in SearchWords)». Саму послідовність подій запишемо у фігурних дужках. В них створимо ще один цикл foreach. Другий цикл виконується стільки разів, скільки раз у тексті зустрічається конкретне слово для пошуку, наприклад перше слово зустрілось п’ять разів, друге – десять разів. Таким чином, перший цикл виконується два рази, а другий цикл – п’ятнадцять разів. Відкриваємо дужку. Зараз я швидко представлю інформацію про регулярні вирази.
Регулярний вираз (від англ. regular expression, скорочено Regex) — це рядок, що описує або збігається з множиною рядків, відповідно до набору спеціальних синтаксичних правил. Іншими словами, це шаблон для пошуку, за допомогою якого легко знайти необхідний відрізок тексту. Регулярний вираз у мові C# – це клас Regex, а результат окремого збігу регулярного виразу представлений класом Match.
Тому пишемо після дужки Match. Зараз виводиться помилка, оскільки за замовчанням простір імен для регулярних виразів не міститься у проекті. Натискаємо ПКМ – «Разрешить» – using System.Text.RegularExpressions;
Тепер проект розпізнає цей клас з простору імен регулярних виразів, який ми щойно додали у проект.
Вводимо будь-яку назву, наприклад «match», ключове слово «in», клас Regex.Matches. Matches – це колекція усіх збігів заданого шаблону в конкретному тексті. Відкриваємо дужку і вказуємо текст, у якому необхідно шукати (richTextBox1.Text). Ставимо кому і вводимо шаблон регулярного виразу для зіставлення. Друкуємо: @"\b
Равлик позначає, що рядок слід сприймати саме так, як він написаний. Це корисно, якщо у рядку є знаки форматування, такі як перенесення на новий рядок, табуляція тощо. \b означає, що для цього шаблону збіг має починатися з початку слова. Продовжуємо писати: (" + word + @")\b"))
Тепер розберемо, що ми написали: з таким шаблоном збіг у тексті починається на початку слова, яке необхідно було знайти, і закінчується з кінцем слова. Тобто, якщо ми шукаємо слово «то», в слові «ескалатор» не буде збігу. Простими словами, ми шукаємо лише ціле слово.
У фігурних дужках запишемо код, що виконається у циклі. pos = match.Index; Ми записуємо у змінну, що відповідає за позицію для наступного пошуку, позицію у тексті, де був знайдений збіг – це і є властивість Index.
Тепер скористаємося вже вбудованим методом richTextBox.Find, що знайде та виділить необхідний відрізок тексту. У дужках надрукуємо слово, яке необхідно знайти – word. Ставимо кому, пишемо pos – позиція з якої слід шукати. Ставимо кому і друкуємо: RichTextBoxFinds.WholeWord);
RichTextBoxFinds задає параметри пошуку тексту в елементі керування RichTextBox. WholeWord вказує, що слід знайти лише ціле слово.
Тепер, нарешті, виділимо кольором знайдений текст. richTextBox1.SelectionBackColor = Color.Yellow;
Завдяки жовтому кольору стає зрозуміло, що відповідає критеріям пошуку, а що ні. Наприклад, частина слова, чи навіть лише одна літера з нього не буде вважатися збігом, оскільки ми задали такі параметри.
Може здатися, що для того, щоб шукати не лише цілі слова, достатньо просто не вказувати параметр RichTextBoxFinds. Втім, це обов’язково, оскільки ми вказуємо позицію для пошуку, а її можна вказати у методі Find лише тоді, коли третім аргументом методу є певний параметр RichTextBoxFinds. Тому слід лише замінити  WholeWord після RichTextBoxFinds. на None. Тепер перевіримо, чи буде збіг у частині слова.
Програма й досі шукає лише цілі слова. Можна подумати, що слід обрати інший параметр RichTextBoxFinds чи взагалі просто не використовувати його. Але, як вже було сказано, без нього не обійтись. Та й проблема не в ньому. Саме в цьому випадку вирішальну роль грає шаблон регулярного виразу. Позиція для пошуку у RichTextBox береться з індексу збігу цього шаблону з текстом. Оскільки шаблон знаходить лише цілі слова, то й позиція для пошуку у RichTextBox знаходиться лише перед цілими словами.
Просто слід прибрати у шаблоні символи \b.
Тепер, коли ви знаєте, як налаштувати пошук на ціле слово або лише його частину. Оберіть той шаблон, що підходить саме Вам.
Цей проект, на відміну від попередніх, краще зберегти, оскільки пошук використовується дуже часто. І щоб не проходити цей процес кожного разу, Ви можете використати цей код як заготовку, змінюючи його відповідно до нових потреб. Крім того, у наступному відео буде використаний саме цей проект.

Я дякую Вам за увагу, шановні читачі!

Немає коментарів:

Дописати коментар