Loading...
sevdalin avatar sevdalin 38 Точки

Тестван Regex онлайн, не работи в C#?

Здравейте колеги, започнах да решавам Regex и тъкмо бях щастлив, че си направих Pattern-ни сравнително бързо за 2-те задачки от упражненията и като ги пуснах в C# не работеха. Не мога да открия защо, моля някой да ми помогне.

Задача 1: http://pastebin.com/YuSRG4jF

Задача 2: http://pastebin.com/4NAcbmzp

 

Благодаря ви!

0
C# Advanced
Willbe.S avatar Willbe.S 5 Точки

Не съм го тествала, но от пръв поглед мисля, че проблема ти е във foreach-а и на двете задачи.

Първата Console.Write(matches + " "); - трябва да е match

Втората - foreach (MatchCollection match in matches) - трябва да е Match, a не MatchCollection (това и в първата трябва да го оправиш)

Пробвай и виж дали ще се оправи :)

1
21/02/2016 11:34:03
sevdalin avatar sevdalin 38 Точки

Поправих ги тези неща и забелязах, че поради някаква причина String-a ми се беше счупил и той като съм го слагал, сега проработи :) 

Но на задачата Match Phone Number имам един въпрос, който не мога да си обесня. В условието се казва "Ensure that before the '+' sign there is either a space or the beginning of the string", което мисля, че го спазвам със следния Код, защото при проверката  ми ето тук https://regex101.com/r/zW4iC7/1, показва че работи както уж се иска от задачата. Но когато принтирам на конзолата се появява следния резултат:

(Празен ред)
59-2-222-2222
+359 2 222 2222
+359-2-222-2222
Press any key to continue . . .

И не мога да разбера, защо се чупи така.

0
sevdalin avatar sevdalin 38 Точки

Добре аз имам някакъв напредък, окрих, че не съм си модифицирал String-a в C# и сега имам следния резултат при

String phoneNumber = @" +359-2-222-2222, +359/2/222/2222, +359-2 222 2222, +359 2-222-2222, +359-2-222-222, +359-2-222-22222, 
                                +359 2 222 2222, +359-2-222-2222";

string pattern = @"^|[+359]+(-| )[2]\1[\d]{3}\1[\d]{4}\b";

(Празен ред отново, не знам от къде идва)

+359-2-222-2222
+359 2 222 2222
+359-2-222-2222

НО

Ако изтрия Space-a в началото на PhoneNumber string-a @"+359-2-222-2222, +359/....." ми изкарва само това:

(Празен ред отново, не знам от къде идва)

359-2-222-2222
+359 2 222 2222
+359-2-222-2222

Нали в pattern му казвам: "^" което означава началото на всеки нов ред, "|" или... . Пробвах да го направя "^|\s....." за да окаже, началото на всеки нов ред или space и след това хвани еди кое си, но по този начин първия номер ми го изпуска и изкарва само последните 2 резултата. Някаква идея какво и къде греша?

0
21/02/2016 12:11:09
KrasimirStefanov avatar KrasimirStefanov 1 Точки

Заповядай '[\+359]{4}[\-|\/| ][\d]+[\/|\-| ][\d]+[\/|\-| ]{1}[\d]+'

-2
sevdalin avatar sevdalin 38 Точки

Колега, първо това хваща всички номера. Второ, може ли така да сложиш някакъв String и да кажеш заповядай, е дори да работеше... сложи 2 реда коментар. Целта не е някой да ми реши задачата, целта е да разбера как сам да си я реша или поне след като видя решението да знам какво и защо се случва...

0
Filkolev avatar Filkolev 4482 Точки

Квадратните скоби се използват, за да кажеш, че искаш един от символите вътре. [+359] значи един (който и да е) от символите +, 3, 5 или 9. [+359]{4} просто казва, че искаш 4 поредни символа измежду посочените, което може да бъде +359, но може и да е ++++ или 3535 например; аналогично [+359]+ ще мачне каквато и да е поредица от тези символи. В тази връзка няма особен смисъл в квадратните скоби да се слага единичен символ, [\d] е същото като \d.

Чети информацията на сайта, който ползваш. Аз лично предпочитам regex101. Там отдясно е описано какво точно прави pattern-ът, който е въведен, и особено в началото, когато човек тепърва навлиза в дълбоките води на регулярните изрази, е доста полезно. 

1
KrasimirStefanov avatar KrasimirStefanov 1 Точки

Ок, трябва да си ескейпваш специалните символи с „\“, специални символи са \+*-!^$().

Там ти е грешката, и като сложи целия регекс в скоби “()“ ти показва какво се матчва.

0
Filkolev avatar Filkolev 4482 Точки

@KrasimirStefanov,

В рамките на т.нар. character class не е нужно ескейпването на специалните символи (както писах преди малко това ясно се вижда от обяснението на регекса в explanation на regex101). Нужно е единствено ескейпването на тирето, което се ползва за дефиниране на range, ако целта е да се мачне буквално.

0
KrasimirStefanov avatar KrasimirStefanov 1 Точки

Предполагам че след задачата "Extract Hyperlink", може да имам някой обърквания, опитвал съм се да и взема 100 точки повече от 20 пъти и все не ми се получава, мерси за инфото, Фил.

0
sevdalin avatar sevdalin 38 Точки

@Filkolev благодаря за обяснението, да използвам точно този сайт, опитвам се и да чета в дясно какво пише. Това за [+359] си мислех, че трябва да хване само ако имаме точно такава поредица, а по-начина по който ти го обясни, но го разбрах. Но ако искаме да хванем точно такава поредица, какво се пишеше?

0
21/02/2016 13:23:48
Innos avatar Innos 419 Точки

Колега символа ^ означава началото на стринга, не всеки нов ред, ако инпута ти се подава ред по ред резултата е същия, но значението на символа е точно определено. Твоя регекс означава match-ни ми или началото на стринг-а или всичко надясно от OR-a (|) може да го разделиш така "^|[+359]+(-| )[2]\1[\d]{3}\1[\d]{4}\b", понеже началото на стринга е много лесно да го мачнеш (понеже е едно и е в началото) ти вади празния ред, алтернативата е да мачне телефон, ама нали знаеш че OR-a работи по такъв начин че ако първото условие е изпълнено няма нужда да гледаш второто.

0
geiff avatar geiff 71 Точки

Според мен с pattern  = ^|[+359]+(-| )[2]\1[\d]{3}\1[\d]{4}\b казваш ^ или [+359]+(-| )[2]\1[\d]{3}\1[\d]{4}\b, т.е. намира началото на стринга от една страна и телефоните от другат (намира началото на стринга, което ти отпечатва като празен ред и после намира и телефоните, които отпечатва на следващите редове). Пробвай в https://regex101.com/  и като сложеш на мястото на ^ това \b, ще видиш че ще хване и началото на всички думи, т.е. с твоя стринг около 46 matches, и ако го пробваш в VS ще ти ги отпечата като празни редове. Ако махнеш "или" ще ти хване само телефона кото е в началото на стринга. С [+359]+ казваш че може някой от символите вътре да се повтарят повече пъти, т.е. ще хвани и ако започват +++3 или 359, както вече е обяснил Filkolev. Трябва да кажеш само \+359, защото телефона трябва да започва точно с +359. Всъшност преди това трябва да кажеш (?<=^|\s|.) - т.е. преди това да има някои от следните неща ^ или \s или ., но не ги хващай тях, а само ми хвани телефоните, пред които има някой от изброените неща. Ако каже само (?<=^) ще хване само ако телефона е в началото на стринга. Незнам дали съм права, но аз така си ги разбирам. 

2
21/02/2016 14:05:06
sevdalin avatar sevdalin 38 Точки

Добро обяснение, ще поработя още върху проблема. Наистина адмирирам, когато някой отдели 5мин за да напише смислен отговор, отколкото просто да се отчете и да напише нещо.

 

edit: благодаря на всички и на колежката @geiff. Съвпадение или не, след като прочетих всичките ви коментари и най-вече последния на колежката, като че ли ми просветна някаква лампичка, седнах и преправих за 2мин :) Ето и резултата:

\+359(-| )2\1\d{3}\1\d{4}\b

Сега си работи перфектно, тествах го и в C# и също работи. @geiff права си била, че заради ^ ми слага празен ред. Също така го поизчистих, защото бях сложил ненужни скоби като при [\d] примерно. 

Благодаря на всички.

1
22/02/2016 12:49:02
martyz avatar martyz 7 Точки

момент

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