C#   Уроки программирования с нуля. Си-шарп для чайников   C#

Здравствуйте, гость!
Вход
Регистрация


Регулярные выражения в Си-шарп. Класс Regex
В этом уроке мы рассмотрим с вами очень мощный, широко используемый инструмент для обработки текста – регулярные выражения.

Регулярное выражение – это некий шаблон, составленный из символов и спецсимволов, который позволяет находить подстроки соответствующие этому шаблону в других строках. Спецсимволов и различных правил их комбинирования есть очень много, поэтому регулярные выражения можно даже назвать таким себе отдельным языком программирования. Те, кто пользовался поиском по файлам в Windows могут знать, что для того чтобы найти файлы только заданного расширения, задается шаблон типа «*.txt». Здесь «*» - спецсимвол, который означает любые имена файлов. Так вот регулярные выражения предоставляют подобный механизм.

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

Регулярные выражения предоставляют массу возможностей, некоторые из них:

- заменять в строке все одинаковые слова другим словом, или удалять такие слова;
- выделять из строки необходимую часть. Например, из любой ссылки (http://mycsharp.ru/post/33/2013_10_19_virtualnye_metody_v_si-sharp_pereopredelenie_metodov.html) выделять только доменную часть (mycsharp.ru);
- проверять соответствует ли строка заданному шаблону. Например, проверять, правильно ли введен email, телефон т.д.;
- проверять, содержит ли строка заданную подстроку;
- извлекать из строки все вхождения подстрок, соответствующие шаблону регулярного выражения. Например, получить все даты из строки.

Начало работы с регулярными выражениями

Для того, чтобы работать с регулярными выражениями необходимо подключить в начале программы пространство имен using System.Text.RegularExpressions; В Си-шарп работу с регулярными выражениями предоставляет класс Regex. Создание регулярного выражения имеет следующий вид:

Regex myReg = new Regex([шаблон]);


Здесь [шаблон] – это строка содержащая символы и спецсимволы.
У Regex также есть и второй конструктор, который принимает дополнительный параметр – опции поиска. Это мы рассмотрим далее.

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

static void Main(string[] args)
{
   string data1 = "Петр, Андрей, Николай";
   string data2 = "Петр, Андрей, Александр";
   Regex myReg = new Regex("Николай"); // создание регулярного выражения
   Console.WriteLine(myReg.IsMatch(data1)); // True
   Console.WriteLine(myReg.IsMatch(data2)); // False
   Console.ReadKey();
}


Здесь в качестве шаблона выступает однозначная строка "Николай". Дальше был использован метод IsMatch, который проверят, содержит ли заданная строка (data1, data2) подстроку соответствующую шаблону.

Методы класса Regex

Рассмотрим кратко методы для работы с регулярными выражениями:

IsMatch – проверяет содержит ли строка хотя бы одну подстроку соответствующую шаблону регулярного выражения. Работа этого метода показана в примере выше.

Match – возвращает первую подстроку, соответствующую шаблону, в виде объекта класса Match. Класс Match предоставляет различную информацию о подстроке – длину, индекс, само значение и другое.

static void Main(string[] args)
{
   string data1 = "Петр, Андрей, Николай";
   Regex myReg = new Regex("Николай");
   Match match = myReg.Match(data1);
   Console.WriteLine(match.Value); // "Николай"
   Console.WriteLine(match.Index); // 14
   Console.ReadKey();
}


Matches – возвращает все подстроки соответствующие шаблону в виде коллекции типа MatchCollection. Каждый элемент этой коллекции типа Match.

static void Main(string[] args)
{
   string data1 = "Петр, Николай, Андрей, Николай";
   Regex myReg = new Regex("Николай");
   MatchCollection matches = myReg.Matches(data1);
   Console.WriteLine(matches.Count); // 2
   foreach (Match m in matches)
     Console.WriteLine(m.Value); //вывод всех подстрок "Николай"
   Console.ReadKey();
}


Replace – возвращает строку, в которой заменены все подстроки, соответствующие шаблону, новой строкой:

static void Main(string[] args)
{
   string data1 = "Петр, Николай, Андрей, Николай";
   Regex myReg = new Regex("Николай");
   data1 = myReg.Replace(data1, "Максим");
   Console.WriteLine(data1); //"Петр, Максим, Андрей, Максим"
   Console.ReadKey();
}


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

static void Main(string[] args)
{
   string data1 = "Петр,Николай,Андрей,Николай";
   Regex myReg = new Regex(",");
   string[] names = myReg.Split(data1); // массив имен
   Console.ReadKey();
}


Специальные символы

В примерах выше рассматривались очень простые, однозначные регулярные выражения без использования спецсимволов. Спецсимволов существует достаточно много, их описание приведу ниже в таблицах:

Классы символов

ОбозначениеОписаниеШаблонСоответствие
[группа_символов]Любой из перечисленных в скобках символов. Используя тире можно указать диапазон символов, например, [a-f] - то же самое, что [abcdef][abc]«a» в «and»
[^группа_символов]Любой символ, кроме перечисленных в скобках[^abc]«n», «d» в «and»
\dЦифра. Эквивалентно [0-9]\d«1» в «data1»
\DЛюбой символ, кроме цифр. Эквивалентно [^0-9]\D«y» в «2014y»
\wЦифра, буква (латинский алфавит) или знак подчеркивания. Эквивалентно [0-9a-zA-Z_]\w«1», «5», «с» в «1.5с»
\WЛюбой символ, кроме цифр, букв (латинский алфавит) и знака подчеркивания. Эквивалентно [^0-9a-zA-Z_]\W«.» в «1.5с»
\sПробельный символ (пробел, табуляция, перевод строки и т. п.)\s« » в «c sharp»
\SЛюбой символ, кроме пробельных\S«c» «s» «h» «a» «r» «p» в «c sharp»
.Любой символ, кроме перевода строки. Для поиска любого символа, включая перевод строки, можно использовать конструкцию [\s\S]c.harp«csharp» в «mycsharp»

Символы повторения

ОбозначениеОписаниеШаблонСоответствие
*Соответствует предыдущему элементу ноль или более раз\d*.«a», «1b», «23c » в «a1b23c»
+Соответствует предыдущему элементу один или более раз\d+.«1b», «23c » в «a1b23c»
?Соответствует предыдущему элементу ноль или один раз\d?\D«a», «1b», «3с» в «a1b23c»
{n}Соответствует предыдущему элементу, который повторяется ровно n раз\d{2}«43», «54», «82» в «2,43,546,82»
{n,} Соответствует предыдущему элементу, который повторяется минимум n раз\d{2,}«43», «546», «82» в «2,43,546,82»
{n,m} Соответствует предыдущему элементу, который повторяется минимум n раз и максимум m\d{2,}«43», «546», «821» в
«2,43,546,8212»

Символы привязки

ОбозначениеОписаниеШаблонСоответствие
^Соответствие должно находиться в начале строки^\d{2}«32» в «32,43,54»
$Соответствие должно находиться в конце строки или до символа \n при многострочном поиске\d{2}$«54» в «32,43,54»
\bСоответствие должно находиться на границе алфавитно-цифрового символа (\w) и не алфавитно-цифрового (\W)\b\d{2}«32», «54» в «32 a43 54»
\BСоответствие не должно находиться на границе\B\d{2}«43» в «32 a43 54»
\GСоответствие должно находиться на позиции конца предыдущего соответствия\G\d«3», «2», «4» в «324.758»

Символы выбора

ОбозначениеОписаниеШаблонСоответствие
|Работает как логическое «ИЛИ» - соответствует первому и/или второму шаблонуone|two«one», «two» в «one two three»
(группа_символов)Группирует набор символов в единое целое для которого дальше могут использоваться + * ? и т.д. Каждой такой группе назначается порядковый номер слева направо начиная с 1. По этому номеру можно ссылаться на группу \номер_группы(one)\1«oneone» в «oneone onetwoone»
(?:группа_символов)Та же группировка только без назначения номера группы(?:one){2}«oneone» в «oneone onetwoone»

Другие символы

ОбозначениеОписаниеШаблонСоответствие
\tСимвол табуляции\t
\vСимвол вертикальной табуляции\v
\rСимвол возврата каретки\r
\nСимвол перевода строки\n
\fСимвол перевода страницы\f
\Символ, который позволяет экранировать специальные символы, чтобы те воспринимались буквально. Например, чтобы было соответствие символу звёздочки, шаблон будет выглядеть так \*\d\.\d«1.1», «1.2» в «1.1 1.2»

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

Приведу пример программы, которая проверят корректность электронного адреса (шаблон тот же, что и на странице регистрации на этом сайте):

static void Main(string[] args)
{
   Regex myReg = new Regex(@"[A-Za-z]+[\.A-Za-z0-9_-]*[A-Za-z0-9]+@[A-Za-z]+\.[A-Za-z]+");
   Console.WriteLine(myReg.IsMatch("email@email.com")); // True
   Console.WriteLine(myReg.IsMatch("email@email")); // False
   Console.WriteLine(myReg.IsMatch("@email.com")); // False
   Console.ReadKey();
}


Здесь перед началом строки регулярного выражения стоит символ «@» который указывает комплятору воспринимать все символы буквально. Это необходимо, чтобы корректно воспринимался символ «\».

Параметры поиска

Здесь мы поговорим о втором конструкторе Regex, который принимает в качестве второго аргумента значение перечисления RegexOptions. В этом перечисление есть следующие значения:

IgnoreCase – игнорирование регистра при поиске. Находит соответствия независимо прописными или строчными буквами в строке написано слово;
RightToLeft – поиск будет выполнен справа налево, а не слева направо;
Multiline – многострочный режим поиска. Меняет работу спецсимволов «^» и «$» так, что они соответствуют началу и концу каждой строки, а не только началу и концу целой строки;
Singleline – однострочный режим поиска;
CultureInvariant - игнорирование национальных установок строки;
ExplicitCapture – обеспечивается поиск только буквальных соответствий;
Compiled – регулярное выражение компилируется в сборку, что делает более быстрым его исполнение но увеличивает время запуска;
IgnorePatternWhitespace – игнорирует в шаблоне все неэкранированные пробелы. С этим параметром шаблон «a b» будет аналогичным шаблону «ab»;
None – использовать поиск по умолчанию.

Пример программы с использованием параметра поиска (игнорирование регистра):

static void Main(string[] args)
{
   string data = "nikolay, sergey, oleg";
   Regex myRegIgnoreCase = new Regex(@"Sergey", RegexOptions.IgnoreCase);
   Regex myReg = new Regex(@"Sergey");
   Console.WriteLine(myRegIgnoreCase.IsMatch(data)); // True
   Console.WriteLine(myReg.IsMatch(data)); // False
   Console.ReadKey();
}


Если необходимо установить несколько параметров, тогда они разделяются оператором поразрядного «ИЛИ» - «|»

Regex myReg = new Regex(@"Sergey", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);


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

public static string GetDomain(string url)
{
   Regex re = new Regex("http://", RegexOptions.IgnoreCase);
   url = re.Replace(url, ""); // удаляем часть http://

   Regex reWww = new Regex(@"www\.", RegexOptions.IgnoreCase);
   url = reWww.Replace(url, ""); //удаляем часть www.

   int end = url.IndexOf("/");
   if (end != -1)
     url = url.Substring(0, end);
   return url;
}
static void Main(string[] args)
{
   string url1 = "http://mycsharp.ru/post/33/2013_10_19_virtualnye_metody_v_si-sharp_pereopredelenie_metodov.html";
   string url2 = "http://www.mycsharp.ru/post/33/2013_10_19_virtualnye_metody_v_si-sharp_pereopredelenie_metodov.html";
   Console.WriteLine(GetDomain(url1)); // mycsharp.ru
   Console.WriteLine(GetDomain(url2)); // mycsharp.ru
   Console.ReadKey();
}


Домашнее задание

1. Создайте программу, которая будет проверять корректность ввода логина. Корректным логином будет строка от 2-х до 10-ти символов, содержащая только буквы и цифры, и при этом цифра не может быть первой.

2. Создайте фильтр мата. Метод будет принимать исходную строку, и возвращать результат, где нехорошие слова будут заменены на «цензура». Обработайте хотя бы одно такое слово, только предусмотрите множество его форм. Если вы собираетесь результат вашей работы оставить здесь, в комментариях, тогда фильтруйте любые другие слова, но не маты :)

PS. Не забудьте поделиться с друзьями этой статьей с помощью кнопок социальных сетей.
Понравилась статья? Подпишись на рассылку и узнавай первым о новых уроках по почте!


Поделиться с друзьями:
26 мар 2014 03:54
sergiipototskyi 24 мар 2017 14:55

namespace Mycsharp22
{
class Program
{
public static void Censor(string text)
{
List<Regex> reg = new List<Regex>();
AddWord(reg);

foreach (Regex r in reg)
{
MatchCollection matches = r.Matches(text);
foreach (Match m in matches)
{
text = r.Replace(text, "censored");
}
}
Console.WriteLine(text);
}

public static List<Regex> AddWord(List<Regex> reg)
{
string word;
do
{
Console.WriteLine("Enter word to censor. Enter '*' to quit");
word = Console.ReadLine();
reg.Add(new Regex(word));
}
while (word != "0");
return reg;
}

static void Main(string[] args)
{
string song = "I've been through the badword1 on a horse with no name \nIt felt good to be badword2 of the rain \nIn the desert you can badword3 your name \n'Cause there ain't no badword1 for to give you no pain";
Censor(song);
Console.ReadKey();
}
}
}

Financeglilk 13 янв 2017 16:25
Всем привет)
Регулярные выражения в Си-шарп. Класс Regex

Юрец 28 ноя 2016 23:14

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;

namespace RegulaR
{
class Program
{
static void Main(string[] args)
{
//самопроверка
string stroka = "Строка для проверки р99ег7уляр52ных выражений";// задаем строку в которой будем искать через регулярку
//Строка для проверки р99ег7уляр52ных выражений
Regex reg = new Regex(@"\S");// задаем условие регулярки
Console.WriteLine(reg.IsMatch(stroka));
//Console.WriteLine("\"");
Console.ReadKey();


Console.WriteLine("Введите логин от 2-х до 10-ти символов (допускаются буквы и цифры, цифра не может быть первой)");
string stro4ka = Console.ReadLine();

Regex login = new Regex(@"^\D[A-Za-z0-9]{1,9}$");//проверяем что логин не начинается с цифры и длиной от 2-х до 10-ти символов
//(\w\d){2}
while(!login.IsMatch(stro4ka))//проверям корректность с помощью цикла
{
Console.WriteLine("Ошибка, логин должен быть от 2-х до 10- символов и начинаться с буквы. Повторите ввод");
stroka = Console.ReadLine();
}

Console.WriteLine("Логин {0} введен правильно", stro4ka);
Console.ReadKey();

//проверка на цензуру
string[] badWords = { "жопа", "срака", "пердак" };//создаем массив стоп слов
Regex shabMat;


Console.WriteLine("Введите фразу в которой есть слова жопа срака или пердак");
string fraza = Console.ReadLine();
string zamena = "ЦЕНЗУРА";

foreach (string rep in badWords)
{
shabMat = new Regex(@"\w*" + rep+ @"\w*");//проверяем по шаблону, ищим соответствие
fraza = shabMat.Replace(fraza, zamena);// заменяем на цензурное слово
}
Console.WriteLine(fraza);
Console.ReadKey();

//Regex antiMat = new Regex(@"\w*бля\w*");// проверяем на словоформу
//Console.WriteLine(antiMat.IsMatch(fraza));
//Console.ReadKey();


}
}
}

domznaniy.ru 09 ноя 2016 11:34
Compiled - регулярное выражение компилируется в сборку, что значительно увеличивает скорость их выполнения, но снижает скорость загрузки. Кроме того, скомпилированные регулярные выражения выгружаются только при завершении работы приложения, даже когда сам объект Regex освобождён и уничтожен сборщиком мусора.

bas-tion.ru 10 май 2016 14:19

// Создаём фильтр мата
// Метод работает со строкой и заменяет мат на цензура
// Данные для проверки берутся из массива.

string aText = "У Маши большая жжжA. Раззззи. Да это всё Хххня!"; // Текст для теста
string replaceWord = "Цензура"; // слово для замены
Regex regBadWord; // регулярное выражение
string[] badWords = { "жжж", "ххх", "ззз" }; // массив плохих слов, корни

foreach (string element in badWords) // Перебираем массив плохих слов
{
// создаём объект регулярного выражения, который игнорирует регистр
// за основу берётся корень, слева и справа от корня могут быть
// только буквы.
regBadWord = new Regex("[а-яa-z]*"+ element +"[а-яa-z]*", RegexOptions.IgnoreCase);
// заменяем данные и записываем в переменную
aText = regBadWord.Replace(aText, replaceWord);

}
Console.WriteLine(aText);
Console.ReadKey();

bas-tion.ru 10 май 2016 01:48

static void Main(string[] args)
{
// Создаём регулярное выражение
Regex regLogin = new Regex("^[а-яА-Яa-zA-Z]{1}[а-яА-Яa-zA-Z0-9]{1,9}$");
// ^[а-яА-Яa-zA-Z]{1} Шаблон первого символа в строке.
// [а-яА-Яa-zA-Z0-9]{1,9}$ - Шаблон последних 9и символов в строке.

Console.WriteLine("Введите Логин");
string myLogin = Console.ReadLine();

Console.WriteLine(regLogin.IsMatch(myLogin));

while (!regLogin.IsMatch(myLogin)) // цикл если условие не выполняется.
{
Console.WriteLine("Не соответствует правилам, повторите попытку.");
myLogin = Console.ReadLine();

}
Console.WriteLine("Логин {0} введён правильно", myLogin);
Console.ReadKey();
}

Wehuty 10 май 2016 00:03
Влад,
можно вместо {return false;} сделать вывод ошибки с текстом (например {throw new Exception("Нельзя так");}), можно пострадать через void метод. Вариантов "для поизвращатся" много, но актуально ли оно? Не проще через if в main'е вывести текст?

//задания:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
class Program
{
public static bool CheckPassword(string password)
{
Regex re = new Regex(@"[A-Z][A-Z0-9]{1,9}", RegexOptions.IgnoreCase);

if (re.IsMatch(password))
return re.Match(password).Length==password.Length?true:false;
else
return false;
}

public static string Censor(string text)
{
Regex re = new Regex(@"редис((ками)|(кам)|(ка)|(ку)|(ке)|(кой)|(ки)|(ок))", RegexOptions.IgnoreCase);

return re.Replace(text,"!CENSORED!");
}

static void Main(string[] args)
{
string pass1 = "qaz1";
Console.WriteLine(CheckPassword(pass1));
string pass2 = "QAZ1";
Console.WriteLine(CheckPassword(pass2));
string pass3 = "Qaz1";
Console.WriteLine(CheckPassword(pass3));
string pass4 = "qaz";
Console.WriteLine(CheckPassword(pass4));
string pass5 = "!qaz";
Console.WriteLine(CheckPassword(pass5));
string pass6 = "1qaz";
Console.WriteLine(CheckPassword(pass6));
Console.WriteLine(Censor("редиска редискередискуредиской редиски редисками редискам редисок редиск"));
Console.ReadKey();
}
}
}

Михаил 12 апр 2016 16:28
Первое задание.

Вывод:


True
False


Программа:


class LoginParser
{
const int minLenght = 2;
const int maxLenght = 10;

private string login;
private bool isLoginCorrect;

public LoginParser (string login)
{
this.login = login;
}

public bool isCorrect ()
{
this.parse ();

return this.isLoginCorrect;
}

private void parse ()
{
if (this.login.Length < minLenght || this.login.Length > maxLenght) {
this.isLoginCorrect = false;
}

Regex parser = new Regex ("[a-zA-Z]+[a-zA-Z0-9]+");

this.isLoginCorrect = parser.Match(this.login).Length == this.login.Length;
}
}

class Example
{
static void Main(string[] args) {
LoginParser parser1 = new LoginParser ("abc12345");
LoginParser parser2 = new LoginParser ("1abc12345");

Console.WriteLine (parser1.isCorrect());
Console.WriteLine (parser2.isCorrect());
}
}

Влад 24 мар 2016 00:13
Слушайте, а вот по поводу первого задания. Что нужно сделать чтобы пользователя оповещало что именно он сделал не так? Опробовал несколько вариантов - не получилось. Буду рад, если кто поможет!

rinostar 11 мар 2016 10:43
у меня вопрос, не связанный с задачами из урока, но все же вдруг кто-то сможет помочь. мне нужно найти слова из списка по двум буквам, они не стоят рядом. Например, ##о##и# списке будет соответствовать "вторник". Как в данном случае правильно задать шаблон?

ТолиКС 21 фев 2016 18:57
// string Login_input = textBox1.Text;
string Login_input = "tolyan_k_RU";


Regex reg_log = new Regex(@"(^[^\d?])(\w{2,10}$)");
Match match_reg_log = reg_log.Match(Login_input);

if (reg_log.IsMatch(Login_input))
MessageBox.Show("Success!\nДанный логин соответсвует требованиям: " + match_reg_log.Value);
else
MessageBox.Show("Неверный формат логина : " + Login_input);



Игорь 16 фев 2016 10:33
Программа о работе ))).
class Program
{
public static void qwerty(string s)
{
Regex asd=new Regex(@"\D*раб*\D");
if (asd.IsMatch(s))
{
Console.WriteLine("Да это плохое слово не повторяй его");
}
else
{
Console.WriteLine("Хороший мальчик/девочка, не ругайся");
}

}
static void Main(string[] args)
{
Console.WriteLine("Введите пожалуйста выржение без мата");
string s = Console.ReadLine();
qwerty(s);


}
}
}

Игорь 16 фев 2016 09:23
класс мопед вроде лишний. А так вроде все в тему ))).
Спасибо огромное за уроки.
class Program
{
class Moped
{
public static void Proverka_vvoda(string s)
{
Regex vvod = new Regex(@"^[0-9]");
if (vvod.IsMatch(s))
{
Console.WriteLine("Пароль начинается с цифры ввод не верен. Повторите пожалуйста ввод");
}
Regex vvod1 = new Regex(@"\D*\d*");
if (vvod1.IsMatch(s) | s.Length < 8)
{
Console.WriteLine("Пароль введен верно");
}
}
}
public static void Proverka_vvoda(string s)
{
Regex vvod=new Regex(@"^[0-9]");
if (vvod.IsMatch(s))
{
Console.WriteLine("Пароль начинается с цифры ввод не верен. Повторите пожалуйста ввод");
}
Regex vvod1 = new Regex(@"\D[2,8]");
if (vvod1.IsMatch(s) | s.Length < 8)
{
Console.WriteLine("Пароль введен верно");
}
}


static void Main(string[] args)
{
Console.WriteLine("Введите корректный пароль который будет содержать от 2 до 8 цифр");
string asd = Console.ReadLine();
Proverka_vvoda(asd);
}
}
}

neronovs 17 янв 2016 15:07
The second task:

static void Main(string[] args)
{
string inputText = "The worse word in the text is bastard , but the best is beauty";
string censor = "bastard";
string outputText = "";
Regex separator = new Regex(" ");

Console.WriteLine(inputText);
string[] words = separator.Split(inputText);
for (int i = 0; i < words.Length; i++)
{
if (words[i] == censor)
words[i] = "CENSOR";
}

for (int i = 0; i < words.Length; i++)
{
outputText += words[i] + " ";
}

Console.WriteLine("-------------------------------outline");
Console.WriteLine(outputText);
Console.ReadKey();
}

neronovs 17 янв 2016 05:06
The first task:

class Program
{
static void Main(string[] args)
{
string pass;
for (;;)
{
Console.WriteLine("Input your password. It should be 2-10 symbols, including letters and digits only and a number must not be the first one.");
pass = Console.ReadLine();

Regex myReg = new Regex(@"[A-Za-z0-9]"); //the creation of the regular expression (only letters and digits)
Regex first = new Regex(@"^[0-9]"); //the creation of the regular expression (no digits an the beginning of the string)
if (myReg.IsMatch(pass))
{
Console.WriteLine("string's length is " + pass.Length);
if (pass.Length >= 2 && pass.Length <= 10) //check the length of the string (2 - 10 symbols)
{
if (first.IsMatch(pass))
{
Console.WriteLine("The first character in your password " + pass + " is digit. Reenter your password.");
}
else
{
Console.WriteLine("Your password " + pass + " is entered correctly");
}
}
else Console.WriteLine("Reenter your password. Be cause - '" + pass + "' is less than 2 or more than 10 symbols");
}
else Console.WriteLine("Reenter your password. Be cause - '" + pass + "' has incorrect symbols");

}
}
}

Denis 15 янв 2016 06:52
Можно реализовать компактнее ?


private static List<string> log = new List<string>();

private static Regex firstCharIsDigital = new Regex(@"\d");
private static Regex digitalsAndCharsOnly = new Regex(@"\W");
//private static Regex overAllCheck = new Regex(@"^\d{1}\W{1,9}$");

public static void loginEnter() {

string login = null;
string exit = null;

while (true) {

Console.WriteLine("Введите логин");

try {

login = Console.ReadLine();
if (firstCharIsDigital.IsMatch(login.Substring(0, 1))) {
Console.WriteLine("Login must not start from digitals");
continue;
}
if (login.Length < 2 || login.Length > 10) {
Console.WriteLine("Login must be at least 2 to 10 characters" + "\nlogin lenght is: " + login.Length);
continue;
}
if (digitalsAndCharsOnly.IsMatch(login.ToString())) {
Console.WriteLine("Login must content characters and digitals only");
continue;
}
Console.WriteLine("Success" + ". New login is \"" + login + "\"");
Console.WriteLine("Type \"y\" to exit");
exit = Console.ReadLine();
if (exit.Equals("y")) {
break;
}
} catch (Exception ex) {

Console.WriteLine("Error: try different login");
log.Add(ex.ToString());
}
}

if (log.Count > 0) {
foreach (var item in log) {
Console.WriteLine("\n" + item);
}
}
}

regexp 29 дек 2015 22:43
"шаблон тот же, что и на странице регистрации на этом сайте"
"[A-Za-z]+[\.A-Za-z0-9_-]*[A-Za-z0-9]+@[A-Za-z]+\.[A-Za-z]+"
хоть кто-то обратил внимание, что это фонарь?
поиск в "email@nigga.com.zimbabve" is not ismatch
да и не все случаи проверены. хотя хватит косяка и в домене с 3 уровня

Тарас 19 окт 2015 03:32
ДРУГЕ ЗАВДАННЯ


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace ConsoleApplication___ZaminaSliv
{
class Program
{
static void Main(string[] args)
{
string d = "Коля сука любить трахати котів";
Regex myReg = new Regex("сука|трахати");

d = myReg.Replace(d, "№;%?*%;" );
Console.WriteLine(d);

Console.ReadKey();

}
}
}

Mercurial 29 сен 2015 12:40
Первая задача


static void Main(string[] args)
{
string login = "";
bool check = false;

Regex checkLogin = new Regex("^[a-zA-Z]{1}[0-9a-zA-Z]{1,9}$");
Console.Write("Введите логин >> ");
while (check == false)
{
login = Console.ReadLine();
check = checkLogin.IsMatch(login);

if (check == false)
Console.Write("Некорректный ввод, попробуйте снова >> ");
}
Console.Write("Ваш логин: " + login);
Console.ReadKey();
}

Максим 29 июл 2015 17:22
sergey
---
Используйте несколько шаблонов отдельно для каждого условия

sergey 22 июл 2015 20:56
Ребята как как создать шаблон который проверял бы наличие маленьких больших букв и цифр да еще чтоб не меньше 8 , ну типа создание пароля не меньше 8 символов чтоб присутствовали и цифры и маленькие и большие буквы , а то я всю голову себе сломал не знаю как

caco3 18 июл 2015 16:07

Первое задание:
static void Main(string[] args)
{
Regex myReg = new Regex(@"^[a-zA-Z]{1}[0-9a-zA-Z]{1,7}$");
string Login;
while (true){
Console.WriteLine("Придумайте логин. Логин должен состоять из цифр и букв,\nпричём на первом месте не может стоять цифра: ");
Login = Console.ReadLine();
if ((myReg.IsMatch(Login) == true)) break;
}
}

Flamingo 22 июн 2015 21:22
Я нашёл решение проблемы сам. Спасибо!

static internal void CheckEmail(string Email)
{
Regex CheckEmail = new Regex(@"[0-9a-zA-Z]+\@[0-9a-zA-Z]+\.[a-z]");
if (!CheckEmail.IsMatch(Email))
Console.WriteLine("Эектронный адрес введён некорректно!");
else
Console.WriteLine("На почту " + Email + " было выслано письмо!");
}
static void Main(string[] args)
{
Console.WriteLine("Введите свою электронную почту:");
string Email = Console.ReadLine();
CheckEmail(Email);
}

Flamingo 22 июн 2015 20:39
Максим, ради интереса я попробовал сделать свою проверку электронного адреса, но она не работает. Посмотри, пожалуйста.

static internal void CheckEmail(string Email)
{
Regex CheckEmail = new Regex(@"[0-9a-zA-Z]\@[0-9a-zA-Z]\.[a-z]");
if (!CheckEmail.IsMatch(Email))
Console.WriteLine("Эектронный адрес введён некорректно!");
}
static void Main(string[] args)
{
Console.WriteLine("Введите свою электронную почту:");
string Email = Console.ReadLine();
CheckEmail(Email);
}

Алексей 18 июн 2015 19:45
А почему программа не ругается если Data1 начинается с символа "[" ?


Regex myReg = new Regex("^[a-zA-z]+[0-9a-zA-Z]");
Console.WriteLine("Введите пароль");
string Data1 = Console.ReadLine();

if (((Data1.Length < 2) || (Data1.Length > 10)) || (myReg.IsMatch(Data1) == false))

{
Console.WriteLine(" Password incorrect.");
}

else

Console.WriteLine("Welcome");


Максим 17 июн 2015 17:26
Vonvee
---
Почитайте урок 30 (нужно использовать ключевое слово ref)

Vonvee 17 июн 2015 13:29
2-ое задание.
Решил переделать программу, использовав метод, не возвращающий значения. Фильтр перестал работать. Почему?


using System.Text.RegularExpressions;

namespace Filtr
{

class Program
{
public static void Filter(string s)
{
Regex re = new Regex(@"мат1|мат2", RegexOptions.IgnoreCase);

s=re.Replace(s, "@#!$%&");
}
static void Main(string[] args)
{
Console.WriteLine("Введите строку");
string str1=Console.ReadLine();
Filter(str1);
Console.WriteLine("Исправленный вариант: "+ str1 );
Console.ReadLine();
}
}
}


Александр_Бугай 22 май 2015 12:51
static void Main(string[] args)
{
Console.WriteLine("Input your login");
string login = Convert.ToString(Console.ReadLine());
if (login.Length < 2 || login.Length > 10) Console.WriteLine("You must to input login with lenght from 2 to 10");
else
{
Regex myLogin = new Regex(@"^\D{1}\S");
if (!myLogin.IsMatch(login)) Console.WriteLine("First char must be a letter");
else Console.WriteLine("Welcome!");
}

Console.ReadLine();
}

Максим 20 май 2015 20:12
Александр_Бугай
---
if (filter1.IsMatch(words) == true)

IsMatch возвращает true или false, не нужно это значение лишний раз сравнивать само с собой, достаточно этого:
if (filter1.IsMatch(words)) // !filter1.IsMatch(words) для false

Александр_Бугай 20 май 2015 14:18
Задание 2
class Program
{
public static void Filter(string words, string[]badWord)
{
Regex filter1 = new Regex(badWord[0]);
Regex filter2 = new Regex(badWord[1]);
Regex filter3 = new Regex(badWord[2]);
Console.WriteLine((filter1.IsMatch(words)));
if (filter1.IsMatch(words) == true) words = filter1.Replace(words, "!!!cencored!!!");
if (filter2.IsMatch(words) == true) words = filter2.Replace(words, "!!!cencored!!!");
if (filter3.IsMatch(words) == true) words = filter3.Replace(words, "!!!cencored!!!");
Console.WriteLine(words);
}
static void Main(string[] args)
{
string[] badWord = new string[3];
for (int i = 0; i < 3; i++)
{
Console.WriteLine("Input bad word, that you dont want to see here:");
badWord[i] = Convert.ToString(Console.ReadLine());
}
Console.WriteLine("Input word:");
string words = Convert.ToString(Console.ReadLine());
Filter(words, badWord);
Console.ReadLine();
}
}

Максим 17 май 2015 18:40
Азиз
---
В первом задании вы использовали регулярные выражения по минимуму, а урок об этом. Можно одним выражением покрыть все условия корректного логина, ниже в комментариях есть варианты. Но, по сути, с заданием вы справились.

Азиз 17 май 2015 16:24
Укоротил, намного компактней:
string text = "Hi мАт1, I decided to мат2";
Console.WriteLine(Regex.Replace(text,@"мат1|мат2","censore",RegexOptions.IgnoreCase));
Console.ReadLine();

Азиз 17 май 2015 15:38
А вот и второе задание :) Все работает

public static void Main(string[] args)
{
string text = "Hi мАт1, I decided to мат2";
Console.WriteLine(filter(text));
Console.ReadLine();
}
public static string filter(string text)
{
Regex ex = new Regex(@"мат1|мат2",RegexOptions.IgnoreCase);
return ex.Replace(text,"censore");
}

Азиз 17 май 2015 15:24
Вот сделал первое задание, как вам реализация?

public static void Main(string[] args)
{
Console.WriteLine(isRight(Console.ReadLine()));
Console.ReadLine();
}
public static bool isRight(string login)
{
Regex reg = new Regex(@"\W");
if (reg.IsMatch(login)) {
return false;
}
else if (login.Length < 2 || login.Length > 10) {
return false;
}
reg = new Regex(@"\d");
if (reg.IsMatch(login[0].ToString())) {
return false;
}
return true;

}

bpla 08 апр 2015 11:36
kod alexvolf mojna uprostit tak:


static void Main(string[] args)
{
Regex sverka = new Regex(@"^[A-Za-z]{1}[0-9A-Za-z]{1,9}$");
while (true)
{
Console.WriteLine("Введите пароль, чтобы закрыть программу:");
string log = Console.ReadLine();
if (sverka.IsMatch(log))
break;
Console.WriteLine("Неправильный пароль\n");
}
}

Максим 27 фев 2015 18:30
Oper
---
Много чего можно было бы добавить, но времени маловато свободного

Oper 27 фев 2015 14:56
Админ,
Было бы не плохо добавить возможность редактирования комментариев. А то я отправил комментарий и потом увидел что немного не полностью выполнил ТЗ и не могу поправить.

В общем что бы много не писать, привожу исправленную строку со второй задачи:
            Regex censureReg = new Regex(@"(\bлоп\b)|\bна\b|\b(петросян)(|а|ка)\b", RegexOptions.IgnoreCase);

Oper 27 фев 2015 14:29
Задача 1.
using System;
using System.Text.RegularExpressions;

namespace Task1
{
class Program
{
static void Main(string[] args)
{
Regex loginReg = new Regex(@"^[a-zA-Z][a-zA-Z0-9]{1,9}$");
string[] login = { "a", "ab", "1b", "a234567890", "a23456789R", "a2345*7890", "a2345_7890", "a23456789b", "a23456789;", "a2345678 b", "a234567890b" };

foreach (string l in login)
Console.WriteLine("{0,-12}: {1}",l,loginReg.IsMatch(l));

Console.ReadKey();
}
}
}
Задача 2.
using System;
using System.Text.RegularExpressions;

namespace Task2
{
class Program
{
static string Censure(string str)
{
Regex censureReg = new Regex(@"лоп\b|\bна\b|петросян\b", RegexOptions.IgnoreCase);
return censureReg.Replace(str, "[цензура]");
}
static void Main(string[] args)
{
string text = "Да, ты, лоп! У тебя лопнул шарик на. Твой брат лоп то же на. А твоя жена - Петросян, пора на. Тест: она нано нам однако на весна слова. На, на ,на,на!на;на*на.";

Console.WriteLine("Оригинал:\n{0}\n",text);
Console.WriteLine("Антимат:\n{0}\n", Censure(text));
Console.ReadKey();

}
}
}

SDenV 26 фев 2015 09:13
Спасибо за ответ.
Вариант regexp += @"|" + slov[i] был изначально у меня прописан, но при таком варианте заменяются все слова, содержащие данный набор букв, а окончания и приставки остаются.
Хотелось бы добавить возможные варианты мата в словарь со всеми окончаниями и всё, а нормальные слова, содержащие данные сочетания букв оставались. Поэтому прописывал такую сложную конструкцию, но при этом удаляются перед словом и после: пробелы и точки и т.д.

Максим 25 фев 2015 19:23
SDenV
---
Не совсем понимаю зачем это: "(((\s+)|(^))" и "((\s)|([.])))", такого создания выражения будет недостаточно?
regexp += @"|" + slov[i] ;

SDenV 25 фев 2015 17:31
Добрый вечер.
Сделал задание 2 с применение словаря.
Но... Как сделать, чтобы точка и пробел не исчезали при замене?

namespace Regex_RegularExpressions
{
class Program
{
static void Main(string[] args)
{
string s = "Собака Бублик. Баранка была укушена собакой по имени Бублик.";
Console.WriteLine(Cenzura.censuraFiltr(s));
}
static bool loginTrue(string login)
{
Regex reg = new Regex(@"^[A-Za-z](\wf*){1,7}$");
return reg.IsMatch(login);
}
}
class Cenzura
{
public static string censuraFiltr(string s)
{
FileStream fs = new FileStream("Test.txt", FileMode.Open, FileAccess.Read);
StreamReader str = new StreamReader(fs, System.Text.Encoding.GetEncoding("windows-1251"));
string slovarCens = str.ReadToEnd();
string[] slov = slovarCens.Split(' ');
str.Close();
string regexp = @"(((\s+)|(^))" + slov[0] + @"((\s)|([.])))";
Console.WriteLine(regexp);
for (int i = 0; i < slov.Length; i++)
{
regexp += @"|(((\s+)|(^))"+slov[i]+@"((\s)|([.])))";
Console.WriteLine(regexp);
}
Regex reg = new Regex(regexp, RegexOptions.IgnoreCase);
s = reg.Replace(s, "CENSOR");
return s;
}
}
}

AlexWolf 25 фев 2015 16:58
Вот моя домашка. Вроде все более-менее понятно :) Чем-то напоминает урок про строки, только тут более гибкий функционал.

первая


namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
bool correct=false;
while (!correct)
{
Console.WriteLine("Введите пароль, чтобы закрыть программу.\n");
string log = Console.ReadLine();
Regex sverka = new Regex(@"^[A-Za-z]{1}[0-9A-Za-z]{1,9}$");
Console.WriteLine("Неправильный пароль");
if (sverka.IsMatch(log)==true)
{
correct=true;
}
}
}
}
}


вторая


namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string data1 = "Эй, да ты коп, мазафака! Сдохни факин битч! Фак, нас не догонят!";
Regex filtr = new Regex(@"(мазафака)|(Фак)(ин|,| )|(битч)",RegexOptions.IgnoreCase);
Console.WriteLine(data1);
Console.WriteLine("Нажмите любую кнопку чтобы включить фильтр.");
Console.ReadKey();
Console.Clear();
data1 = filtr.Replace(data1,"Цензура!");
Console.WriteLine(data1);
Console.ReadKey();
}
}
}

Виталий 24 фев 2015 09:20
Сделал!!! Только выдает несколько слов "Ошибка!!!". А вообще, работает:
p.s как хорошо вчера отпраздновали?

class Program
{
static void Main(string[] args)
{
Regex Reg1 = new Regex(@"(Однокласник)(а|и|у|)|(Агенств)(о|а|у|е|)|(Тайланд)(а|у|е|)|(Расчита)(л|ть|а|ли|ла)|(Здела)(ли|ла|л|ть)|(Отзовы|а|)", RegexOptions.IgnoreCase);
string pult;
while (true)
{
pult = Console.ReadLine();
pult = Reg1.Replace(pult, "Ошибка!!!!!!");
Console.WriteLine(pult);
Console.ReadKey();
}
}
}

Виталий 24 фев 2015 09:12
--admin--
Вот, переделал. Но почему-то опять только агентство.

class Program
{
static void Main(string[] args)
{
Regex Reg1 = new Regex(@"[А](генств)[о|е|у|а]", RegexOptions.IgnoreCase);
Regex Reg2 = new Regex(@"[О](днокласник)[у|а|и|]", RegexOptions.IgnoreCase);
Regex Reg3 = new Regex(@"[Т](айланд)[а|у|е|]", RegexOptions.IgnoreCase);
string pult;
while (true)
{
pult = Console.ReadLine();
pult = Reg1.Replace(pult, "Ошибка!!!");
pult = Reg2.Replace(pult, "Ошибка!!!");
pult = Reg3.Replace(pult, "Ошибка!!!");
Console.WriteLine(pult);
}
}
}

Максим 23 фев 2015 18:15
Виталий
---
Посмотрите в уроке что означают скобки [], после этого станет ясно что символом | стоит разделять лишь шаблоны отдельных слов.
[днокласник] это должно быть в скобках (). Ну и используйте параметр RegexOptions.IgnoreCase, а не определяйте "вручную" заглавная первая буква или нет

Виталий 23 фев 2015 16:04
Обьясните пожалуйста. Почему?

Виталий 23 фев 2015 14:43
Вернее не всё, а только агентство.

Виталий 23 фев 2015 14:30
Что-то было неправильно в файле. Скопировал содержание файла в reg1, все получилось:

class Program
{
static void Main(string[] args)
{
Regex Reg1 = new Regex(@"[О|о][днокласник][а|и|у|]|[А|а][генств][о|а|у|е|]|[Т|т][айланд][а|у|е|]|[Р|р][асчита][л|ть|а|ли|ла]|[З|з][дела][ли|ла|л|ть]|[О|о][тзов][ы|а|]");
string pult;
pult = Console.ReadLine();
pult = Reg1.Replace(pult, "Ошибка!!!!!!");
Console.WriteLine(pult);
Console.ReadKey();
}
}

Виталий 23 фев 2015 13:06
Надеюсь, мыслю в правильном направлении. Но почему-то не удается.

class Program
{
static void Main(string[] args)
{
FileStream slovaroshibok = new FileStream("d:\\Slovar-oshibok.txt", FileMode.Open, FileAccess.Read);
StreamReader kanaldostupa1 = new StreamReader(slovaroshibok, Encoding.UTF8);
Regex Reg1 = new Regex(Convert.ToString(kanaldostupa1));
string pult;
while (true)
{
pult = Console.ReadLine();
Reg1.IsMatch(pult);
Reg1.Replace(pult, "Ошибка!!!!!!");
Console.WriteLine(pult);
}
}
}

Содержание файла:

[О|о][днокласник][а|и|у|]|[А|а][генств][о|а|у|е|]|[Т|т][айланд][а|у|е|]|[Р|р][асчита][л|ть|а|ли|ла]|[З|з][дела][ли|ла|л|ть]|[О|о][тзов][ы|а|]

Максим 22 фев 2015 23:52
Виталий
---
Нужно добавить сивол привязки $, чтобы соответсвие заканчивалось этим шаблоном:

Regex reg1 = new Regex(@"^\D{1}\S{1,9}$);

Виталий 22 фев 2015 19:09
Единственное, что я так и не смог сделать в первой домашке. Это ограничение символов. Хотел бы понять почему не работает?

class Program
{
static void Main(string[] args)
{
while (true)
{
string pult;
pult = Console.ReadLine();
Regex reg1 = new Regex(@"^\D{1}\S{1,9}");
Console.WriteLine(reg1.IsMatch(pult));
}
}
}

Виталий 22 фев 2015 17:21
Это была вторая домашка, вот первая:

class Program
{
static void Main(string[] args)
{
while (true)
{
string pult;
pult = Console.ReadLine();
Regex reg1 = new Regex(@"^[A-Za-z][A-Za-z0-9]");
Console.WriteLine(reg1.IsMatch(pult));
}
}
}

Виталий 22 фев 2015 16:29
Поскольку чужие домашки не читал, своя не получилась. Хотел бы узнать, где у меня ошибка? :

class Program
{
static void Main(string[] args)
{
while (true)
{
string pult;
pult = Console.ReadLine();
Regex Reg = new Regex(@"[А|а][генств][о|а|е|у]|[О|о][днокласник][а|и|у|]");
Reg.IsMatch(pult);
if (Reg.IsMatch(pult) == true)
Reg.Replace(pult, @"[А|а][генств][о|а|е|у]|[О|о][днокласник][а|и|у|]");
Console.WriteLine(pult);
}
}
}

pinguin-linuxoid 27 дек 2014 08:29
Это уже не С# - это уже Perl)

Regex reg1 = new Regex(@"\S+пингвин?[а-я]+",RegexOptions.IgnoreCase);
Regex reg2 = new Regex(@"пингвин?[а-я]+", RegexOptions.IgnoreCase);

Не уверен что пригодится - но эта конструкция способна выкорчевать любое слово с корнем "Пингвин" независимо от префиксов и суффиксов.
Разумеется если использовать оба екзкмпляра reg. Увы не знаю как обеденить в один.

А насчет фильтра мата - как ни парадоксально решение с | оправдало себя самым адекватным)

Диманиак 10 дек 2014 19:01
Admin, спасибо!
Встречал про такие проверки, но не смог сразу осилить.
Изменил на
Regex re = new Regex(@"[а-я]*^(?!стра)(ху|xу|хy|xy)[еёийюя][а-я]*$", RegexOptions.IgnoreCase);
Так более корректно работает под мою задумку. Текст "Сан Саныч, застрахуйтесь на всякий случай!" отрабатывает корректно.

Максим 05 дек 2014 17:37
Диманиак
---
Для исключения строк почитайте про negative look-arounds, вот конкретно для вашего примера:

Regex re = new Regex(@"^(?!стра|застра)[а-я]*(ху|xу|хy|xy)[еёийюя][а-я]*$", RegexOptions.IgnoreCase);

Диманиак 04 дек 2014 23:58
первый урок, который реально вынес мозг
подскажите, где и что конкретно почитать, чтобы научиться составлять шаблон, который бы одновременно искал соответствие определенному регулярному выражению и пропускал соответствие другому определенному регулярному выражению, т.е., чтобы написанная ниже программа находила слова из трех известных букв в различных формах, но слово *страх.й пропускало

Извини, за выбор примера :)

namespace ConsoleApplication1
{
class Program
{
static string Censor(string text)
{
string result = text;
Regex re = new Regex(@"[а-я]*(ху|xу|хy|xy)[еёийюя][а-я]*", RegexOptions.IgnoreCase);// с учетом комбинации русских х и у, а также английских x и y
if (re.IsMatch(text))
result = re.Replace(text, "[censored]");
return result;
}
static void Main(string[] args)
{
string str = "";
Console.WriteLine("Enter text with well-known three-letter word in any form for censoring:");
str = Console.ReadLine();
Console.WriteLine("Censored text is \"" + Censor(str) + "\"");
Console.ReadKey();
}
}
}

Диманиак 04 дек 2014 08:41
Первое задание

namespace ConsoleApplicationTest
{
class Program
{
static void Main(string[] args)
{
Regex re = new Regex(@"^[a-zA-Z]{1}[0-9a-zA-Z]{1,9}\Z");// или @"^[a-zA-Z]{1}\w{1,9}\Z", если разрешить использовать символ "_"
string str = "";
do
{
Console.WriteLine("Enter correct Login:");
str = Console.ReadLine();
}
while (!re.IsMatch(str));
Console.WriteLine("Login \"" + str+ "\" is correct");
Console.ReadKey();
}
}
}

why_not 14 ноя 2014 13:09
Ой, бессмысленная строка с if.

why_not 14 ноя 2014 13:05
1е задание:

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

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string login;
Console.WriteLine("Input your login");
login = Console.ReadLine();
Regex myReg = new Regex(@"^[A-Za-z]{1}[0-9A-Za-z]{1,9}$");
Console.WriteLine(login);
Console.WriteLine(myReg.IsMatch(login));

Console.ReadKey();

}
}
}


2e задание:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{

string str1 = "I`ll Luck ur lucking LUCK when u luck my lucking LUCK";
Regex myReg = new Regex(@"Luck|luck|LUCK");
if (myReg.IsMatch(str1) == true)
str1 = myReg.Replace(str1, "****");
Console.WriteLine(str1);
Console.ReadKey();
}
}
}

Максим 13 окт 2014 20:58
Firik
---
Нужно доработать чтобы использовалось только одно регулярное выражение для всех слов в файле

Firik 13 окт 2014 00:14
Спасибо большое, всё получилось! Вот оно)))
FileStream fff = new FileStream("C:\\Users\\Кр\\Desktop\\m.txt", FileMode.Open, FileAccess.Read);
StreamReader reader = new StreamReader(fff);
FileStream ggg = new FileStream("C:\\Users\\Кр\\Desktop\\o.txt", FileMode.Open, FileAccess.Read);
StreamReader readerr= new StreamReader(ggg, System.Text.Encoding.GetEncoding("windows-1251"));//указал кодировку и всё заработало


var b = readerr.ReadLine();
var a = reader.ReadLine();



string SMS = "Fuck the police";
Regex myReg = new Regex(a, RegexOptions.IgnoreCase);
string PMP = "барашка, ты ведь БАРАН ";
Regex myReg1 = new Regex(b, RegexOptions.IgnoreCase);

PMP = myReg1.Replace(PMP, "CENSORED");
SMS = myReg.Replace(SMS, "ЦЕНЗУРА");

Console.WriteLine(SMS);
Console.WriteLine(PMP);

Console.ReadKey();

Максим 12 окт 2014 15:44
Firik
---
Попробуйте указать кодировку:

StreamReader reader = new StreamReader(fff, System.Text.Encoding.GetEncoding("windows-1251"));

Firik 12 окт 2014 10:10
Всё сделал, переделал на ReadLine(), но остался один вопрос! Пишу в файле русские слова, пытаюсь вывести - выдаёт ???(на каждую букву знак вопроса). И конечно же не заменяет, что подскажите?

Максим 10 окт 2014 19:17
Firik
---
Вам нужно считывать файл построчно - ReadLine(), и из этих строк формировать регулярное выражение, разделяя слова символом "|". Должна получиться строка типа "fuck|shit"

Firik 10 окт 2014 14:50
Итак, вроде бы уже лучше но всё равно... так оно то заменяет одно слово, но если в файл через ENTER вводить ещё слова - то или не заменяет или выбивает кучу раз Цензура... Может как-то вводить надо по особому?

FileStream fff = new FileStream("C:\\Users\\Кристина\\Desktop\\m.txt", FileMode.Open, FileAccess.Read);
StreamReader reader = new StreamReader(fff);

var a = reader.ReadToEnd();// в файле одно слово Fuck


string SMS = "Fuck the police";
Regex myReg = new Regex(a, RegexOptions.IgnoreCase);

SMS = myReg.Replace(SMS, "ЦЕНЗУРА");

Console.WriteLine(SMS);

Console.ReadKey();

Максим 09 окт 2014 16:07
Firik
---
Конечно ругается, вместо шаблона вы передаете в конструктор файловый поток. Создайте поток на чтение StreamReader, считайте файл и тогда передайте в конструктор

Firik 08 окт 2014 15:27
В общем пытаюсь сделать, но не получается, компилятор ругается, подскажите как изменить?(код не дописан, просто на этом моменте уже не понятно)

static void Main(string[] args)
{

FileStream fff = new FileStream("C:\\Users\\Кр\\Desktop\\m.txt", FileMode.Open, FileAccess.Read);
string SMS = "Барашка ты, а я нет";
Regex myReg = new Regex(fff, RegexOptions.IgnoreCase);



Console.ReadKey();
}

Максим 08 окт 2014 15:15
Firik
---
Так сами попробуйте это реализовать, будет только в пользу

Firik 08 окт 2014 15:09
А можно пример для программы с подключенным словарём ?

Максим 30 сен 2014 18:47
Firik 28 сен 2014 23:24
---
Первое задание слишком "вручную" сделано, можно за одно регулярное выражение всё проверить.

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

Firik 29 сен 2014 17:09
2 задание

class Program
{
public static string Filtr(string stroka)
{
Regex parf = new Regex("Иванов|Иван", RegexOptions.IgnoreCase);
stroka = parf.Replace(stroka, "[Censored]");
return stroka;
}
static void Main(string[] args)
{
string stroka = "Иван иванов пошел в магазин за валенками";
Console.WriteLine(Filtr(stroka));
Console.ReadKey();
}
}

Firik 29 сен 2014 16:50
Firik 29 сен 2014 15:22
во первых, ты спер мой ник. во вторых, ты прочитал мои мысли

Firik 29 сен 2014 15:22
На счёт второго задания) можно ли как-то подключить словарь мата, каждое слово которого заменялось бы ЦЕНЗУРОЙ ?)

Firik 28 сен 2014 23:24
а можно 1 задание так?)

class Program
{
static void Main(string[] args)
{
Regex password1 = new Regex("[0-9]");
Regex password2 = new Regex("[a-zA-Z]");
Console.WriteLine("Введите пароль:");
string data1 = Console.ReadLine();
char firstsym = Convert.ToChar(data1.Substring(0, 1));
if ((!(data1.Length < 2 || data1.Length > 10)) && password1.IsMatch(data1) && password2.IsMatch(data1) && Char.IsDigit(firstsym) == false)
{
Console.WriteLine("Ok");
}
else
{
Console.WriteLine("Пароль должен быть от 2 до 10 символов длинной, содержать буквы и цифры и не начинаться на цифру");
}
Console.ReadKey();
}
}

Alexey 10 авг 2014 21:22
Замечен такой эффект - при заполнении шаблона нужно начинать записывать с более длинных вариантов слов, иначе при замене Replace возьмет вхождение более короткого слова и к замене прибавиться остаток от длинного оригинала... Ну т.е. в тексте "... ослика ..." делаем замену по шаблону "ослик|ослика" - результат будет "[цензура]а".

Alexey 10 авг 2014 21:16
Задание второе:
using System;
using System.Text.RegularExpressions;

namespace lesson27_2_FiltrMata
{
class Program
{
static void Main(string[] args)
{
string str1 = "ослик козлику бе-бе по ослиной голове, козлик ослика ко-ко и по-по и то-ро-ро";
try
{
Cenzura stroka1 = new Cenzura(str1);
Console.WriteLine(stroka1.ReplaceMat());
Console.ReadKey();
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
class Cenzura
{
public string Stroka;
public Cenzura(string stroka)
{
Stroka = stroka;
}
public string ReplaceMat()
{
Regex myreg1 = new Regex(@"ослика|ослику|ослиный|ослиная|ослиную|ослиной|ослище|ослел|осла|ослицу|ослик", RegexOptions.IgnoreCase);
return Stroka = myreg1.Replace(Stroka, "[цензура]"); ;
}
}
}

Alexey 10 авг 2014 21:14
Мои варианты.
Задание первое:
using System;
using System.Text.RegularExpressions;

namespace lesson27_1_RegularVyrajeniya
{
class Program
{
static void Main(string[] args)
{
string inputL;
try
{
do
{
Console.Write("Введите логин: ");
inputL = Console.ReadLine();
Login login = new Login(inputL);
login.LoginCheck();
Console.WriteLine();
}
while (inputL != "exit");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

Console.ReadKey();
}
}
class Login
{
public string login;
public bool status = false;
public Login (string login)
{
this.login = login;
}
public void LoginLength()
{
if (!(login.Length >= 2 && login.Length <= 10))
Console.WriteLine("Длина логина должна быть от 2 до 10 символов!");
}
public void LoginFirstChar()
{
if (login == "")
return;
Regex myreg = new Regex(@"[0-9]");
if (myreg.IsMatch(login.Substring(0, 1)))
Console.WriteLine("Логин не может начинаться с цифры!");
}
public void LoginString()
{
if (login == "")
return;
Regex myreg = new Regex(@"[A-Za-z0-9]");
if (!myreg.IsMatch(login))
Console.WriteLine("Логин может состоять только из букв и цифр!");
}

public void LoginCheck()
{
LoginLength();
LoginFirstChar();
LoginString();
}
}
}

Максим 17 июл 2014 15:33
AlexSerikov
---
Для нескольких слов используйте символ выбора "|" - "рак|краб"

AlexSerikov 17 июл 2014 11:22
Ну как ? 2-е задание. Не знаю, как добавить больше слов в матфильтр. Как это делается ? Создавать для каждого слова еще 1 объект класса Regex ?

Regex myRegex = new Regex(@"рак",RegexOptions.IgnoreCase);
Console.WriteLine("Enter your massage");
string login = "Сударь, да вы Рак";
login = myRegex.Replace(login, "Уважаемый человек");
Console.WriteLine(login);
Console.ReadKey();

Максим 17 июн 2014 15:03
Serj
---
Литературу можете посмотреть в разделе "Книги" на этом сайте

Serj 16 июн 2014 21:36
Спасибо за объяснение и за уроки в целом. С нетерпением жду новых уроков. Может посоветуете литературу по C# или где можно найти задания для углубления и закрепления полученных знаний.

Максим 15 июн 2014 22:42
Serj
---
(?= выражение) означает группу с положительной опережающей проверкой. Чтобы было соответствие, необходимо чтобы строка соответствовала "выражению", но при этом в результат проверки не войдет эта часть. Это означает, что если мы возьмем соответсвие по шаблону "^(?=[a-zA-Z])[a-zA-Z0-9]{2,10}$", результатом будет логин будет без первого символа. В конкретном задании так делать смысла нет, но это работает

Serj 15 июн 2014 16:12
второе задание:
Regex ivan_filter = new Regex(@"Ваня?[А-Яа-я]+ *|Иван *");
string name_list = "Федя Ваня Иван Николай Ванька Вениамин Ванюша Петр";
name_list = ivan_filter.Replace(name_list, "Цензура ");
Console.WriteLine(name_list);
Console.ReadKey();

Serj 15 июн 2014 15:46
Я не понял зачем такая конструкция ^(?=[a-zA-Z]) как её читать?

Вот моё первое задание:

Regex myReg = new Regex(@"^[A-Za-z][A-Za-z0-9]{1,9}$");
Console.WriteLine("Введите логин:");
string login = Console.ReadLine();
Console.WriteLine(myReg.IsMatch(login));
Console.ReadKey();

Максим 03 июн 2014 15:21
Ромик
---
Здесь предполагалось использование метода Replace. И стоило бы учесть некоторые спряжения слов: Николай, Николая..

Ромик 03 июн 2014 14:26
Второе задание
string data1 = "Петр, Николай, Андрей, Николай";
string[]arr = data1.Split(' ');
Regex myReg = new Regex("Ник");
for (int i = 0; i < arr.Length; i++)
{
if (myReg.IsMatch(arr[i]))
arr[i] = "Цензура";
if (i < arr.Length)
{
Console.Write(arr[i] + " ");
}
else
Console.Write(arr[i]);
}

Console.ReadKey();

Максим 02 июн 2014 18:18
Ромик
---
Справились же

Ромик 02 июн 2014 17:43
Очень долго сидел и не понимал
Regex myReg = new Regex(@"^(?=[a-zA-Z])[a-zA-Z0-9]{2,10}$");
^ - ДОМИК РЕШИЛ МОЮ ПРОБЛЕМУ!(все остальные символы, которые появились, пробовал уже раз по 10 в разных комбинациях)

Ромик 02 июн 2014 17:29
написал вот первое задание, но ВООБЩЕ не понимаю, когда выбрасывается False , а когда True. Точнее не понятно где он берет 1 символ, с чего он определяет , что это первый символ. Вопросов вагон остался. Слишком сложная тема для меня .
string login;
Console.WriteLine("Введите ваш логин(2-10 символов содержащий только буквы и цифры)");
Regex myReg = new Regex("([a-zA-Z][^0-9])+[a-zA-Z0-9]");//тут добавлял перед закрывающими ковычками {2,10} чтобы не писать иф, результата 0
login = Console.ReadLine();
if (login.Length > 10)
{
return;
}
else
{
Console.WriteLine(myReg.IsMatch(login));
}
Console.ReadLine();

Nikolay 11 апр 2014 18:53
Первое задание
static void Main(string[] args)
{

string reggieexp = @"^(?=[a-zA-Z])(?!.*[._()\[\]-]{2})[A-Za-z0-9._()\[\]-]{2,10}$";
Regex myRegCheckLogin = new Regex(reggieexp);

Console.WriteLine(myRegCheckLogin.IsMatch("Hdfdf34g"));//True
Console.WriteLine(myRegCheckLogin.IsMatch(("1jfjfjdfj")));//Fasle
Console.WriteLine(myRegCheckLogin.IsMatch("sdfdf34gfggfg"));//False
Console.ReadKey();
}


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

Имя (обязат.)
E-mail (обязат., не публикуется)


Для вставки ваших программ пользуйтесь кнопкой "исходный код"
Вёрстка сайта с нуля

Уникальный Видеокурс!

"Научись верстать сайты и заработай на этом!"

Получить видеокурс

Подпишись на курс по программированию, и узнавай первым о новых уроках!

RSS подписка Страничка Вконтакте Мы в Twitter

Ошибка в тексте? Выделите ее мышкой и нажмите Ctrl+Enter
Поблагодарить автора: Номер карты (ПриватБанк)
5168 7572 4170 8660
WebMoney
R372544961915 U685637142028 Z999792764387
Наверх
Система Orphus