[C#] Домашно Strings and Text Processing - 12 задача


8

Условие: Write a program that parses an URL address given in the format: [protocol]://[server]/[resource] and extracts from it the [protocol], [server] and [resource] elements. For example from the URL http://www.devbg.org/forum/index.php the following information should be extracted:

[protocol] = "http"
[server] = "www.devbg.org"
[resource] = "/forum/index.php"

Решениеsource.

Обяснение: Използваме регулярен израз за да разбием адреса на трите части, като имаме предвид, че средната е разделена от "://" и "/", а останалите са съответно в ляво и в дясно.




Отговори



5

Решение:

http://pastebin.com/ZpARHGzG

Обяснение:

1. Създавам си 3 променливи index2Dots, index2Slash и index1Slash. Като на всяка една ще запиша на кой индекс намирам съответно " : " или " // " или       " / ", като по този начин ще знам от каде да започна да принтирам substring-a и с каква дължина.

2. Пускам for цикъл до str.Length-2 и търся " : ", като намеря записвам индекса в променливата index2Dots. Аналогично и за " // "

3. ТЪНКИЯТ МОМЕНТ е че когато намеря " // " пускам втори for цъкъл с водеща променлива k = i +2 , това е така защото по този начин търся една черта " / " след двете черти натам, защото ако беше само k=i тогава веднага щях да октрия една черта(щях да намеря 2-рата черта от 2-ната такава) и ще се оплескат нещатата.

4. След като намеря една " / " записвам и индекса в index1Slash и break; защото мен ме интересува само първата черта а натам може да има много единични такива и ще ми вземе индекса на последната което не ми трябва.

5. Знам че protokol, server и resource ми започват от 3 [index-a]  съответно :

  • protokol започва от началото на string-a до " : " тогава приемам че далжината му е равна на index2Dots.
  • server започва след " // " и завършва на първата " / " тогава смятам дължината му която е индекса на " / " - индеска на " // " serverLength = index1Slash - index2Slash
  • resource започва от първата " / " до края на string-a , следователно дължината му е равна на на дължината на string-a минус индекса на " / " str.Length - index1Slash

6. След като знам вече от каде почват protokol,server и resource по отделно и знам с каква дължина са - Остава да ги Принтна на конзолата с метода substring()

 


от Assi.NET (3050 точки)


0
http://forums.academy.telerik.com/user/Assi.NET Защо ти е маймунката @ като реално без нея си работи перфектно също на For става -1 не -2 в смисъл невиждам какво ескейпваш :) той ескейпа само за принтенето ти трябва. Маймуната е за ескейп на кавичките понеже за да се виждат при принтенето на резултата трябват стандартните кавички + оше едни които да се показват в конзолата, а при дефинирането на стринг по горе не ти трябва ескейп щото то нищо не се повтаря само като има кавичка нестната в кавичка ти трябва ако бъркам нещо моля хейтнете ме :)

от Martin88 (209 точки)

0
Да, тия работи са ми много ясни. Но просто това не ми беше важно не ме интересуваше и не исках да си губя времето сега да ескейпвам. За това сложих една @ и не го мислех повече а кавички нямаше да имам. Само не разбрах защо си постнал линк-а на username-a ми ;)

от Assi.NET (3050 точки)


0
Ако някой знае как да я реши и с три отделни RegEx-a,моля да сподели. Аз не успях, а ми е много интересно как би станало.

от Boyan_Byanov (56 точки)


0

Ето решение с три регулярни израза, макар и с малка измама, защото така и не можах да разкарам единия slash пред server (www). Ако някой знае как да стане ще съм благодарен да сподели :)

http://pastebin.com/nwPEmpZr

edit: малката измама се превърна от Regex.Replace в елегантна група :)


от shristoff (747 точки)


0
Нещо такова: server = @"/([^/][\w\.]*)" и после: matchServer.Groups[1]. Не си ескейпнал точката в горния regex, btw.

от jasssonpet (6814 точки)

0
Да, благодаря, стана така. Явно без група няма начин.

от shristoff (747 точки)


3

Решение: http://pastebin.com/GcqVGW39

Обеснения:

решението е без регулярни изрази 

без цикли


от deyan.keray (266 точки)


0
Тъкмо да се похваля и видях обяснението ти, и така и задачата и се оказа, че доста си приличат, само че аз използвам Remove, за да премахна цялата дума. вместо да я замествам с празен стринг.

от Svetli (280 точки)

0
Не знам дали си предал така домашното, обаче нали после ще ги оценяваме и линка е за твоя блог, а така анонимността се губи. Иначе хубаво решение :)

от Subo_Rusev (1389 точки)


1

Mоят вариант с регулярни изрази: http://pastebin.com/JdCCP279

- чрез регулярен израз отделяме протокола и го печатаме

- чрез Replace махаме протокола от стринга, за да бъде следващата част отново в началото

- повтаряме почти същите стъпки още два пъти и сме готови


от Mitko_Mitev (1276 точки)


0

Ето и моето решение - понеже вече втори ден се мъча да схвана regex класа  и нещо не ми се отдава затова реших задачата повлиян от решенията по-горе, не е много елегантно но работи (на база на нещо като итеративен подход).  

http://pastebin.com/NKWf3YK2

Закоментирани са всички regex-ове (защото пробвах няколко от постнатите решения в дебъгера)

В записа на ресурсите записвам преди и след всеки стринг '/' защото методът направен от мен го трие. 

Достатъчно бързо е - за всички операции изкарва 00:00:00.002-3 секунди, само незнам колко памет заделя решението ми.

 

           
 

 




2

Предлагам още едно решение в пет реда без регулярни изрази:

Решение: цък

Обяснение: Използвам оувърлоада на StringSplit(), при който се задава максимален брой на подстринговете. Това, при положение че входът е строго дефиниран и разделянето на сървъра от ресурса е на първата "/".


от pasariisky (185 точки)


0
на изхода ти се губи първата / преди ресурса

от pdrenovska (2196 точки)

0
Благодаря за основателната забележка, наложи се да добавя още един ред, за да оправя кода.

от pasariisky (185 точки)


4
И моето, малко с готовият клас Uri
Uri uri = new Uri("http://www.devbg.org/forum/index.php"); Console.WriteLine(uri.Scheme); Console.WriteLine(uri.Host); Console.WriteLine(uri.AbsolutePath);



0

Решение

поиграх си с IndexOf. Първо взимам протокола, отмествам го до първия символ след /,  оттам взимам сървъра и докрая е ресурса.


от Rokata (397 точки)


1

Моето решение е http://pastebin.com/NMsbfs4M.  С регулярни изрази намирам и разбивам търсиния израз на групи и ги разпечатвам на конзолата.


от AsenVal (3487 точки)