Loading...
sokitoswag avatar sokitoswag 3 Точки

Advanced c# Exam problems Practice - Problem 3. Extract Hyperlinks (Regex)

Здравейте, имам проблем с една задача от практиката за advanced c# изпита, задачата се решава с регекс.

 https://judge.softuni.bg/Contests/Practice/Index/84#2 това е линкът към задачата, във regex101.com ми намира всички matches, но в програмата ми не . ето го и Regex-а ми - (?<=<a)(.+)\s?href\s*=\s*("|')(.+?)(\2) , ето го и линкът към решението ми http://pastebin.com/uDbPb4Vi - в Judge вади само 33 точки. Ако някой успее да ми помогне и да ми каже къде бъркам ще съм му много благодарен.

Тагове:
2
Fundamentals Module
kidroca avatar kidroca 117 Точки

Здравей, 

ето къде ти е основният проблем: (?<=<a)(.+?)\s?href\s*=\s*("|')(.+?)(\2) и ето защо, сложи ? на посоченото място и ще видиш малко по - добри резултати 

а може и само така: <a(.+?)\s?href\s*=\s*("|')(.+?)\2

Този регекс обаче match-ва 

<a id="href">href='fake'<img src='http://abv.bg/i.gif' alt='abv'/></a>

помисили си как можеш да го оправиш 

 

 

Spoiler - прочети след като се опиташ първо сам


ето как вече работи напълно @"<a([^>]*?)href\s*=\s*(""|')(.+?)\2"

- маркирания регекс оказва до къде да продължи match-ът - да хваща всичко което не е > следователно мачът ще продължи до първият знак > (понеже му е оказано *?) продължението на изразът вече му показва по - конкретно какво да прихваща.

4
09/10/2015 17:34:40
sevdalin avatar sevdalin 38 Точки

Колега поста ти е отдавна, но все пак тъй като аз в момента се мъчех с тази задача, този регекс "<a([^>]*?)href\s*=\s*("|')(.+?)\2 ", не хваща всичко. Примерно от дългия нулев тест не хваща 2 неща, и едното от тях е "/courses". И на другият колега пробвах регекса ама и той не хваща всичко правилно, дори след твоята "поправка".

1
kidroca avatar kidroca 117 Точки

Това е страхотна новина :), защото ти sevdalin ще трябва да откриеш решението. 


С удоволстиве ще ти помогна със малък joker:

След като разгледах нулевият тест и видях кои изрази не са покрити, останових с не малка изненада че поставянето на стойността на атрибут в кавички не е задължително, нещо което признавам си научавам чак сега (и надявам се ще забравя до 3 дни)

Изразът ще трябва да се промени/допълни по такъв начин, че ако след `href=` не следват кавички да се прихване текстът до първият празен символ - Regex-a оставям на теб, успех


Ето материал който може да помогне за валиирането на израза: https://mathiasbynens.be/notes/unquoted-attribute-values

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

0
21/05/2017 19:44:47
sevdalin avatar sevdalin 38 Точки

Благодаря за отговора :) Аз тази задача не успях да я напиша. Опитвах се 1 час някъде да измисля регекса, стигнах до някъде ама не точно до където трябва. А и малко ми беше неясно и условието, защото не знам какви възможности може да има input-a, тъй като не съм много на Ти все още с HTML-a. 

После гледах тук някакви варианти, но в крайна сметка прецених, че искам да си спестя още 2-3 часа мъки за Регекс и да решавам други задачи.

Не знам дали греша или не, но според мен това е Регекс на едно сравнително високо ниво за общите стандарти, а те според моите наблюдения са, че повечето хора поназнайват добре Регекс в един момент (като го учат) после го позабравят и накрая като им трябва нещо в 80-90% от случаите го търсят вече написано/измислено в мрежата :)

0
kidroca avatar kidroca 117 Точки

Съгласен съм с теб, с доста работи е така - търсят се вече доказани решения, дори и да си забравил кое как match-ва много tool-чета като regex101 ти подсказват коя част от израза за какво служи. Понякога се налагат модификации като по - долу, за да нагласиш нещо да работи в по - специфичен слчай.

Много правилно си направил като не си забил на задачата и на мен, понякога, ми се струва че някой задачи искат да си минал 2-3 урока и повече напред за да ги решиш

Едно от първите ми решения въобще не беше със един израз, първо се extract-вахa links, после върху тях се пускаше отделен regex за да вземе стойността на href, доста по - разбираемо и по този начин можеш да видиш коя стъпка не ти е наред, разбиването на подзадачи - това е един от най - важните принципи в програмирането

Сега успях да скълъпя ето това което минава всички тестове: https://regex101.com/r/GLld6A/1

<a([^>]+?)href\s*=\s*("|'|\s?)(.+?)\2(?=\s{1}|>)

Не е надежден израз, но върши работа smiley

Успех с уроците!

1
sevdalin avatar sevdalin 38 Точки

Благодаря ти за отговорите, и без това за съжаление почти никой не пише вече в този форум :)

Аз модула съм го приключил, поне на теорията. В момента решавам изпитните задачи. По програма иначе го почвам днес :)

Но тия регекси, просто си трябват много часове докато навлезеш в тях... ето вчера се мъчих с един привидно "лесен" регекс супер много време. 2часа и нещо се опитвах да я реша цялата задача, и помощ получих даже върху регекса, защото не успях да го докарам и пак не стана 100/100 ама какво да се прави. Естествено не за пръв път я направих по-сложна от колкото всъщност е, но да :)

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