Си шарп как написать поиск по тексту
Перейти к содержимому

Си шарп как написать поиск по тексту

  • автор:

C# поиск слова в тексте

Допустим текст я считываю из файла в строку — это легко. Далее я могу искать методами Contains() или IndexOf() и даже могу игнорировать регистр что хорошо, но очень плохо то что слова ищутся не целиком! Допустим если поисковое слово входит в какое либо другое большое слово, то по-прежнему найдется. Как мне искать только по отдельным словам?

Отслеживать
5,923 17 17 серебряных знаков 32 32 бронзовых знака
задан 25 сен 2016 в 7:35
313 2 2 золотых знака 4 4 серебряных знака 17 17 бронзовых знаков

Split строки на отдельные слова и поиск на полное совпадение по массиву слов, или используйте регулярное выражение

25 сен 2016 в 7:49

Да кажется нашел решение, можно в регулярках использовать \b вот так: (\bслово\b) вроде работает. еще с табами надо проверить)

25 сен 2016 в 7:53

Вы можете сами написать подробный ответ, когда найдёте решение которое вас устраивает и принять лучший, если будут другие ответы

25 сен 2016 в 7:57

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Самый простой способ поиска слова целиком — это использовать регулярное выражением, например, воспользовавшись функцией Regex.IsMatch.
Регулярное выражение должно содержать само слово, которое мы ищем, добавив в начало и конец символ \b — символ для ограничения границы слова

bool result = Regex.IsMatch(text, "\\bслово\\b"); 

Специальный символ \b срабатывает в следующих случаях:

  • Перед первым символом в строке, если первый символ является символом слова.
  • После последнего символа в строке, если последний символ является символом слова.
  • Между двумя символами в строке, где первый из них — символ слова, а другой не символ слова(например, пробел).

Символ слова — это символы регулярного выражения \w.

Си шарп как написать поиск по тексту

Конкатенация строк или объединение может производиться как с помощью операции + , так и с помощью метода Concat :

string s1 = "hello"; string s2 = "world"; string s3 = s1 + " " + s2; // результат: строка "hello world" string s4 = string.Concat(s3, ". "); // результат: строка "hello world. " Console.WriteLine(s4);

Метод Concat является статическим методом класса string, принимающим в качестве параметров две строки. Также имеются другие версии метода, принимающие другое количество параметров.

Для объединения строк также может использоваться метод Join :

string s5 = "apple"; string s6 = "a day"; string s7 = "keeps"; string s8 = "a doctor"; string s9 = "away"; string[] values = new string[] < s5, s6, s7, s8, s9 >; string s10 = string.Join(" ", values); Console.WriteLine(s10); // apple a day keeps a doctor away

Метод Join также является статическим. Использованная выше версия метода получает два параметра: строку-разделитель (в данном случае пробел) и массив строк, которые будут соединяться и разделяться разделителем.

Сравнение строк

Для сравнения строк применяется статический метод Compare :

string s1 = "hello"; string s2 = "world"; int result = string.Compare(s1, s2); if (result <0) < Console.WriteLine("Строка s1 перед строкой s2"); >else if (result > 0) < Console.WriteLine("Строка s1 стоит после строки s2"); >else < Console.WriteLine("Строки s1 и s2 идентичны"); >// результатом будет "Строка s1 перед строкой s2"

Данная версия метода Compare принимает две строки и возвращает число. Если первая строка по алфавиту стоит выше второй, то возвращается число меньше нуля. В противном случае возвращается число больше нуля. И третий случай — если строки равны, то возвращается число 0.

В данном случае так как символ h по алфавиту стоит выше символа w, то и первая строка будет стоять выше.

Поиск в строке

С помощью метода IndexOf мы можем определить индекс первого вхождения отдельного символа или подстроки в строке:

string s1 = "hello world"; char ch = 'o'; int indexOfChar = s1.IndexOf(ch); // равно 4 Console.WriteLine(indexOfChar); string substring = "wor"; int indexOfSubstring = s1.IndexOf(substring); // равно 6 Console.WriteLine(indexOfSubstring);

Подобным образом действует метод LastIndexOf , только находит индекс последнего вхождения символа или подстроки в строку.

Еще одна группа методов позволяет узнать начинается или заканчивается ли строка на определенную подстроку. Для этого предназначены методы StartsWith и EndsWith . Например, в массиве строк хранится список файлов, и нам надо вывести все файлы с расширением exe:

var files = new string[] < "myapp.exe", "forest.jpg", "main.exe", "book.pdf", "river.png" >; for (int i = 0; i

Разделение строк

С помощью функции Split мы можем разделить строку на массив подстрок. В качестве параметра функция Split принимает массив символов или строк, которые и будут служить разделителями. Например, подсчитаем количество слов в сроке, разделив ее по пробельным символам:

string text = «И поэтому все так произошло»; string[] words = text.Split(new char[] < ' ' >); foreach (string s in words)

Это не лучший способ разделения по пробелам, так как во входной строке у нас могло бы быть несколько подряд идущих пробелов и в итоговый массив также бы попадали пробелы, поэтому лучше использовать другую версию метода:

string[] words = text.Split(new char[] < ' ' >, StringSplitOptions.RemoveEmptyEntries);

Второй параметр StringSplitOptions.RemoveEmptyEntries говорит, что надо удалить все пустые подстроки.

Обрезка строки

Для обрезки начальных или концевых символов используется функция Trim :

string text = " hello world "; text = text.Trim(); // результат "hello world" text = text.Trim(new char[] < 'd', 'h' >); // результат "ello worl"

Функция Trim без параметров обрезает начальные и конечные пробелы и возвращает обрезанную строку. Чтобы явным образом указать, какие начальные и конечные символы следует обрезать, мы можем передать в функцию массив этих символов.

Эта функция имеет частичные аналоги: функция TrimStart обрезает начальные символы, а функция TrimEnd обрезает конечные символы.

Обрезать определенную часть строки позволяет функция Substring :

string text = "Хороший день"; // обрезаем начиная с третьего символа text = text.Substring(2); // результат "роший день" Console.WriteLine(text); // обрезаем сначала до последних двух символов text = text.Substring(0, text.Length - 2); // результат "роший де" Console.WriteLine(text);

Функция Substring также возвращает обрезанную строку. В качестве параметра первая использованная версия применяет индекс, начиная с которого надо обрезать строку. Вторая версия применяет два параметра — индекс начала обрезки и длину вырезаемой части строки.

Вставка

Для вставки одной строки в другую применяется функция Insert :

string text = "Хороший день"; string substring = "замечательный "; text = text.Insert(8, substring); Console.WriteLine(text); // Хороший замечательный день

Первым параметром в функции Insert является индекс, по которому надо вставлять подстроку, а второй параметр — собственно подстрока.

Удаление строк

Удалить часть строки помогает метод Remove :

string text = "Хороший день"; // индекс последнего символа int ind = text.Length - 1; // вырезаем последний символ text = text.Remove(ind); Console.WriteLine(text); // Хороший ден // вырезаем первые два символа text = text.Remove(0, 2); Console.WriteLine(text); // роший ден

Первая версия метода Remove принимает индекс в строке, начиная с которого надо удалить все символы. Вторая версия принимает еще один параметр — сколько символов надо удалить.

Замена

Чтобы заменить один символ или подстроку на другую, применяется метод Replace :

string text = "хороший день"; text = text.Replace("хороший", "плохой"); Console.WriteLine(text); // плохой день text = text.Replace("о", ""); Console.WriteLine(text); // плхй день

Во втором случае применения функции Replace строка из одного символа «о» заменяется на пустую строку, то есть фактически удаляется из текста. Подобным способом легко удалять какой-то определенный текст в строках.

Смена регистра

Для приведения строки к верхнему и нижнему регистру используются соответственно функции ToUpper() и ToLower() :

string hello = "Hello world!"; Console.WriteLine(hello.ToLower()); // hello world! Console.WriteLine(hello.ToUpper()); // HELLO WORLD!

C# Regex в примерах

Класс Regex реализует регулярные выражения в C#. В этой статье вы узнаете, как использовать C# Regex для проверки различных пользовательских входных данных.

Regex в C# реализует регулярные выражения. Класс C# Regex предлагает методы и свойства для анализа большого текста, с целью поиска шаблонов символов. В этой статье вы узнаете, как использовать класс .NET Regex в C#.

Регулярные выражения

Регулярное выражение используется для проверки соответствия строки шаблону. Регулярное выражение (regular expression или regex, или regexp) — это последовательность символов, которая определяет шаблон. Шаблон может состоять из литералов, чисел, символов, операторов или конструкций. Шаблон используется для поиска соответствий в строке или файле.
Регулярные выражения часто используются при проверке входных данных, анализе и поиске строк. Например, проверка достоверной даты рождения, номера социального страхования, полного имени, в котором имя и фамилия разделены запятой, поиск числа вхождений подстроки, замена подстрок, форматов даты, допустимых форматов электронной почты, формата валюты, и так далее.

Класс Regex

В .NET класс Regex представляет механизм регулярных выражений. Его можно использовать для быстрого синтаксического анализа большого количества текста, чтобы найти конкретные шаблоны символов, извлекать, редактировать, заменять или удалять текстовые подстроки, и добавлять извлеченные строки в коллекцию для генерации отчета.

Класс Regex определен в пространстве имен System.Text.RegularExpressions. Конструктор класса Regex принимает в качестве параметра строку шаблона вместе с другими необязательными параметрами.

Следующий фрагмент кода создает регулярное выражение из шаблона. Здесь шаблон соответствует слову, начинающемуся с буквы «M».

// Создаем шаблон для слова, которое начинается с буквы "M" string pattern = @"\b[M]\w+"; // Создаем экземпляр Regex Regex rg = new Regex(pattern); 

Следующий фрагмент кода содержит длинный текст с именами авторов, которые необходимо проанализировать.

// Длинная строка string authors = "Mahesh Chand, Raj Kumar, Mike Gold, Allen O'Neill, Marshal Troll"; 

Метод Matches используется для поиска всех совпадений в регулярном выражении и возвращает MatchCollection.

// Получаем все совпадения MatchCollection matchedAuthors = rg.Matches(authors); 

Следующий фрагмент кода проходит по коллекции совпадений.

// Выводим всех подходящих авторов for (int count = 0; count < matchedAuthors.Count; count++) Console.WriteLine(matchedAuthors[count].Value); 
// Создаем шаблон для слова, которое начинается с буквы "M" string pattern = @"\b[M]\w+"; // Создаем экземпляр Regex Regex rg = new Regex(pattern); // Длинная строка string authors = "Mahesh Chand, Raj Kumar, Mike Gold, Allen O'Neill, Marshal Troll"; // Получаем все совпадения MatchCollection matchedAuthors = rg.Matches(authors); /// Выводим всех подходящих авторов for (int count = 0; count < matchedAuthors.Count; count++) Console.WriteLine(matchedAuthors[count].Value); 

В приведенном выше примере код ищет символ «M». Но что, если слово начинается с «м». Следующий фрагмент кода использует параметр RegexOptions.IgnoreCase , для того, чтобы Regex не обращал внимания на регистр.

// Создаем шаблон для слова, которое начинается с буквы "M" string pattern = @"\b[m]\w+"; // Создаем экземпляр Regex Regex rg = new Regex(pattern, RegexOptions.IgnoreCase);

Замена множественных пробелов с помощью Regex

Метод Regex.Replace() используется для замены совпавшей строки новой строкой. В следующем примере выполняется поиск множественных пробелов в строке с заменой на единичный.

// Длинная строка с множественными пробелами string badString = "Here is a strig with ton of white space." ; string CleanedString = Regex.Replace(badString, "\\s+", " "); Console.WriteLine($"Cleaned String: "); 

Следующий фрагмент кода заменяет пробелы на ‘-‘.

string CleanedString = Regex.Replace(badString, "\\s+", "-");

Разбиение строки на символы с помощью Regex

В следующем примере шаблон регулярного выражения [a-z] + и метод Regex.Split() используются для разделения строки на символы без учета их регистра.

// Разбиваем строку по символам string azpattern = "[a-z]+"; string str = "Asd2323b0900c1234Def5678Ghi9012Jklm"; string[] result = Regex.Split(str, azpattern, RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(500)); for (int i = 0; i < result.Length; i++) < Console.Write("''", result[i]); if (i

Регулярные выражения в C#

Регулярные выражения являются стандартом сопоставления с шаблоном для синтаксического анализа и изменения строк, и позволяют пользователю выразить, как компьютерная программа должна искать указанный шаблон в тексте, а затем, что она должна делать, когда найдено каждое совпадение с данным шаблоном. Иногда их сокращают как «regex». Они являются мощным способом поиска и изменения строк, которые принимают определенный формат.

Вот простой пример кода на C#, который показывает, как используются регулярные выражения.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace RegularExpression1 < class Program < static void Main(string[] args) < Regex r = new Regex(@"^\+?\d\-?\d\-?\d"); // класс Regex представляет неизменное регулярное выражение. string[] str = < "+91-9678967101", "9678967101", "+91-9678-967101", "+91-96789-67101", "+919678967101" >; // Входные строки для сопоставления с действительным номером мобильного телефона. foreach (string s in str) < Console.WriteLine(" a valid mobile number.", s, r.IsMatch(s) ? "is" : "is not"); // Метод IsMatch используется для валидации строки, или чтобы гарантировать, что строка соответствует определенному шаблону. > > > > 

Вот подробное объяснение регулярных выражений и их использования в C# и .NET:
Регулярные выражения в C#

Regex для проверки электронной почты

Для проверки множества адресов электронной почты мы можем использовать следующие регулярные выражения. Мы разделяем адреса с помощью разделителя ';'

Если вы хотите использовать разделитель ',', то используйте следующее

и если вы хотите использовать оба разделителя ',' и ';' то используйте это

Таким образом, используя приведенное выше регулярное выражение, вы можете проверять как один, так и несколько адресов сразу.

Проверка пользовательского ввода с помощью регулярных выражений

В этой статье объясняется, как использовать регулярные выражения (класс Regex пространства имен System.Text.RegularExpressions) в C# и .NET.

Мы можем использовать метод Regex.Match, который принимает входные данные и регулярное выражение, и возвращает success, если

if (!Regex.Match(firstNameTextBox.Text, "^[A-Z][a-zA-Z]*$").Success) <> if (!Regex.Match(addressTextBox.Text, @"^[0-9]+\s+([a-zA-Z]+|[a-zA-Z]+\s[a-zA-Z]+)$").Success) if (!Regex.Match(cityTextBox.Text, @"^([a-zA-Z]+|[a-zA-Z]+\s[a-zA-Z]+)$").Success) if (!Regex.Match(stateTextBox.Text, @"^([a-zA-Z]+|[a-zA-Z]+\s[a-zA-Z]+)$").Success) if (!Regex.Match(zipCodeTextBox.Text, @"^\d$").Success) < if (!Regex.Match(phoneTextBox.Text, @"^[1-9]\d-[1-9]\d-\d$").Success) 

Разделить строку с помощью Regex.split(регулярное выражение) в C#

В этой части мы узнаем, как разбивать строку, используя RegEx в C#. Regex разбивает строку на основе шаблона. Он обрабатывает разделитель, указанный в качестве шаблона. Вот почему Regex лучше, чем string.Split. Вот несколько примеров того, как разбить строку, используя Regex в C#. Давайте напишем код.

Для использования Regex для разбиения строки нужно добавить следующие пространства имен.

using System; using System.Text.RegularExpressions; using System.Collections.Generic; 

Отделить цифры от строк с помощью Regex.

string Text = "1 One, 2 Two, 3 Three is good."; string[] digits = Regex.Split(Text, @"\D+"); foreach (string value in digits) < int number; if (int.TryParse(value, out number)) < Console.WriteLine(value); >> 

Приведенный выше код разбивает строку, используя \D+, и выводит цифры посредством итерации по результату.

Узнайте больше можно здесь:

Заменить специальные символы из строки с помощью Regex

В этой части я расскажу вам о том, как заменить специальные символы с помощью регулярных выражений в C#.

Если у вас есть строка со специальными символами и вы хотите удалить или заменить их, вы можете использовать для этого регулярное выражение.

Используйте следующий код:

Regex.Replace(your String, @"[^0-9a-zA-Z]+", "") 

Этот код удалит все специальные символы, но если вы не хотите удалять некоторые специальные символы, например, запятую "," и двоеточие ":" — внесите следующие изменения:

Regex.Replace(Your String, @"[^0-9a-zA-Z:,]+", "")

Точно так же вы можете вносить изменения в соответствии с вашими требованиями.

Следует отметить, что регулярные выражения не являются панацеей для каждой небольшой манипуляции со строкой. Если вам нужен простой синтаксический анализ, предоставляемый классом String или другими классами, старайтесь его и использовать.

Для дальнейшего прочтения

Если вы новичок в регулярных выражениях, я рекомендую прочитать эту статью "Введение в регулярные выражения".

Программирование на C, C# и Java

Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы

ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode

Программа для поиска файлов на C#

В уроке будет написана консольная программа для поиска файлов на C#. Код, который используется для поиска, очень полезен для решения ряда задач. Он пригодится Вам для написания более сложных программ.

Поиск файлов в языке программирования C# осуществляется с помощью метода EnumerateFiles класса Directory, находящегося в пространстве имён System.IO фреймворка .NET.

Чтобы воспользоваться методом, сначала нужно подключить пространство имён с помощью директивы using:

using System . IO ;

Метод EnumerateFiles имеет следующий прототип:

Directory . EnumerateFiles ( catalog , fileName , SearchOption ) ;

  • catalog (строковый тип string) — путь к каталогу в котором будет производиться поиск. Регистр символов не учитывается.
  • fileName (строковый тип string) — имя файла для поиска. Оно может содержать подстановочные поисковые символы: * и ?. Звездочка обозначает произвольное количество символов на её месте, а знак вопроса — один символ на месте подстановки.
  • SearchOption — это перечисление задающее опции поиска. Имеет два значения: SearchOption.TopDirectoryOnly (поиск будет выполнен только в текущем каталоге) и SearchOption.AllDirectories (поиск будет произведён в указанном каталоге и во всех его подкаталогах).

Метод EnumerateFiles возвращает перечислимую коллекцию строк — полных имён (путь + имя) файлов, полученных в результате поиска.

Перебирать все результаты поиска удобно с помощью оператора цикла foreach.

Напишем программу на языке программирования C#, демонстрирующую поиск файлов.

using System ;
using System . Collections . Generic ;
using System . IO ;
namespace TestConcole
class Program
static void Main ( string [ ] args )
string catalog = @"C:\Users\Игорь\Desktop\Тест" ;
string fileName = "Файл.txt" ;
//проводим поиск в выбранном каталоге и во всех его подкаталогах
foreach ( string findedFile in Directory . EnumerateFiles ( catalog , fileName ,
SearchOption . AllDirectories ) )
FileInfo FI ;
//по полному пути к файлу создаём объект класса FileInfo
FI = new FileInfo ( findedFile ) ;
//найденный результат выводим в консоль (имя, путь, размер, дата создания файла)
Console . WriteLine ( FI . Name + " " + FI . FullName + " " + FI . Length + "_байт" +
" Создан: " + FI . CreationTime ) ;
catch //слишком длинное имя файла

В переменной catalog указан путь к папке, в которой будет происходить поиск. Переменная fileName содержит имя файла для поиска. Поиск происходит с параметром SearchOption.AllDirectories, то есть файлы ищутся в указанном каталоге (catalog) и всех его подпапках.

Коллекция результатов поиска перебирается в цикле foreach (строка 16). С помощью полного имени каждого найденного файла (findedFile) создаётся объект класса FileInfo (строка 19, 23). Данный класс позволяет получать различную информацию о файле. Некоторые параметры выведем в консоль для демонстрации (строка 25): имя файла, полное имя файла, размер в байтах, а также дату и время создания файла.

Во время создания экземпляра класса FileInfo может возникнуть исключительная ситуация, когда имя файла (findedFile) слишком велико. Для перехвата такой ситуации используется оператор try-catch.

Представленную программу для поиска файлов на C# протестируем на специально созданном для этого каталоге с файлами и подкаталогом.

Папка с файлами для поиска

Результаты поиска по запросу «Файл.txt» представлены ниже.

Поиск файлов на C#

Теперь попробуем выполнить поиск, используя подстановочные символы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *