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 точки. Ако някой успее да ми помогне и да ми каже къде бъркам ще съм му много благодарен.
Колега поста ти е отдавна, но все пак тъй като аз в момента се мъчех с тази задача, този регекс "<a([^>]*?)href\s*=\s*("|')(.+?)\2 ", не хваща всичко. Примерно от дългия нулев тест не хваща 2 неща, и едното от тях е "/courses". И на другият колега пробвах регекса ама и той не хваща всичко правилно, дори след твоята "поправка".
Това е страхотна новина :), защото ти sevdalin ще трябва да откриеш решението.
С удоволстиве ще ти помогна със малък joker:
След като разгледах нулевият тест и видях кои изрази не са покрити, останових с не малка изненада че поставянето на стойността на атрибут в кавички не е задължително, нещо което признавам си научавам чак сега (и надявам се ще забравя до 3 дни)
Изразът ще трябва да се промени/допълни по такъв начин, че ако след `href=` не следват кавички да се прихване текстът до първият празен символ - Regex-a оставям на теб, успех
Ето материал който може да помогне за валиирането на израза: https://mathiasbynens.be/notes/unquoted-attribute-values
Поуката е, дори да е позволено, моля ограждайте с кавички стойността на атрибутите
Благодаря за отговора :) Аз тази задача не успях да я напиша. Опитвах се 1 час някъде да измисля регекса, стигнах до някъде ама не точно до където трябва. А и малко ми беше неясно и условието, защото не знам какви възможности може да има input-a, тъй като не съм много на Ти все още с HTML-a.
После гледах тук някакви варианти, но в крайна сметка прецених, че искам да си спестя още 2-3 часа мъки за Регекс и да решавам други задачи.
Не знам дали греша или не, но според мен това е Регекс на едно сравнително високо ниво за общите стандарти, а те според моите наблюдения са, че повечето хора поназнайват добре Регекс в един момент (като го учат) после го позабравят и накрая като им трябва нещо в 80-90% от случаите го търсят вече написано/измислено в мрежата :)
Съгласен съм с теб, с доста работи е така - търсят се вече доказани решения, дори и да си забравил кое как match-ва много tool-чета като regex101 ти подсказват коя част от израза за какво служи. Понякога се налагат модификации като по - долу, за да нагласиш нещо да работи в по - специфичен слчай.
Много правилно си направил като не си забил на задачата и на мен, понякога, ми се струва че някой задачи искат да си минал 2-3 урока и повече напред за да ги решиш
Едно от първите ми решения въобще не беше със един израз, първо се extract-вахa links, после върху тях се пускаше отделен regex за да вземе стойността на href, доста по - разбираемо и по този начин можеш да видиш коя стъпка не ти е наред, разбиването на подзадачи - това е един от най - важните принципи в програмирането
Сега успях да скълъпя ето това което минава всички тестове: https://regex101.com/r/GLld6A/1
Не е надежден израз, но върши работа
Успех с уроците!
Благодаря ти за отговорите, и без това за съжаление почти никой не пише вече в този форум :)
Аз модула съм го приключил, поне на теорията. В момента решавам изпитните задачи. По програма иначе го почвам днес :)
Но тия регекси, просто си трябват много часове докато навлезеш в тях... ето вчера се мъчих с един привидно "лесен" регекс супер много време. 2часа и нещо се опитвах да я реша цялата задача, и помощ получих даже върху регекса, защото не успях да го докарам и пак не стана 100/100 ама какво да се прави. Естествено не за пръв път я направих по-сложна от колкото всъщност е, но да :)