Софтуерно Инженерство
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
Technology Fundamentals
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 37 Точки

Колега поста ти е отдавна, но все пак тъй като аз в момента се мъчех с тази задача, този регекс "<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 37 Точки

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

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

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

0