Loading...
NonaG avatar NonaG 111 Точки

Въпрос за Regex

Конкретната задача е Football League от Programming Fundamentals Exam - 12 June 2016

Но въпросът не е за решението й, а за възможния реджекс за нея: как да се направи работещ патърн за извеждане на текст между ключова дума, зададена от input-а. Т.е. keytextkey. Проблемът е, че в нулевите тестове ключовата дума е с опция за мета чарове, т.е. трябва да бъдат искейпнати. Напр.:

key=?? или key=KZL

Текст:

??ecnarF?? ??kramneD?? 

fdKZLairagluBKZL KZLkramneDKZLll

Вариант за патърн в първия случай: @"(\?\?)([A-Za-z]+)(\?\?)"

Вариант за патърн във втория случай: @"(KZL)([A-Za-z]+)(KZL)"

Има ли вариант за патърн в общия случай: @"(key)([A-Za-z]+)(key)", където впоследствие "key" ще се риплейсне с input-а за нея?

 

Тагове:
0
Programming Fundamentals
ambiorix avatar ambiorix 640 Точки

Здравей. Копие на мой пост от друга тема:

Относно взимането на стринг от променлива взета от конзола вътре в регекса - трябва да му сложих доларче отпред и вътре да е в скоби(като placeholder и по-точно string interpolation). За да стане по-ясно, примерен мини код на който подаваш ключова дума и после в мач колекция изважда всички съвпадения които са от думата заградена в две произволни цифри:

 

string keyWord = Console.ReadLine();
string text = Console.ReadLine();
string pattern = $@"\d+{keyWord}\d+";
Regex regex = new Regex(pattern);

MatchCollection matches = regex.Matches(text);

foreach (Match match in matches)
{
    Console.WriteLine(match.ToString());
}

1
NonaG avatar NonaG 111 Точки

Жоре /може ли?/, във VS2013 не бачка. Можеш ли да намериш друг вариант? /ще си изтегля и на този лаптоп 2015, но не сега, да мине изпита, че все още има вероятност да се запиша/

0
ambiorix avatar ambiorix 640 Точки

Няма проблем, да :)

Щом е от версията на VS, то по-добре си свали 2015, защото ще ти е по-лесно от Regex.Escape() варианта според мен.

0
Silvave avatar Silvave 127 Точки

Символите които escape-ва "@" са:

', ", \, \0, \a, \b, \f, \n, \r, \t, \u, \U, \x, \v

съответно другите символи, които са специални при regex, като ?, не се escape-ват. Затова и ако пробвате първият нулев пример на задачата с keyWord = "??" ще изгърми, защото въпросителните не са escape-нати с @-та. Така и ще стане и при други специални символи за regex: 

. $ ^ { [ ( | ) * + ? \

Тука е описано всичко по-подробно - https://msdn.microsoft.com/en-us/library/4edbef7e(v=vs.110).aspx.

0
Silvave avatar Silvave 127 Точки

Здравей, има Regex.Escape метод, който връща string с escape-нати специални символи - https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.escape(v=vs.110).aspx

Иначе патърна на regex-a за Football League може да стане така...

string sep = Regex.Escape(Console.ReadLine());

string strRegTemp = $"^.*{sep}(.*){sep}.*{sep}(.*){sep}.* ([0-9]+):([0-9]+)$";

Regex regexStr = new Regex(strRegTemp);

 

1
NonaG avatar NonaG 111 Точки

Писали сме едновременно, благодаря!

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.