Професионална програма
Loading...
+ Нов въпрос
preslavgetov avatar preslavgetov 3 Точки

Regex проблеми

Здравейте,

Решавам задачите от Lab-a за Regex във C# Fundamentals. Стигам до втората задача - Match Phone Number.

Трябва да match-нем +359 2 222 222 и +359-2-222-2222, но не и 359-2-222-2222, +359/2/222/2222, +359-2 222 2222
+359 2-222-2222, +359-2-222-222, +359-2-222-22222.

Използвайки regex101 както ни е препоръчано в лекцията пиша следния regex - \+359([\s|-])2\1[0-9]{3}\1[0-9]{4}.

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

Някой може ли да обясни как да се напише това. Гледах подобни теми, но повечето реджекси там нито са обяснени нито са особено четими. Имаме ли нужда освен това от \b? Предната задача пропада без това. \b междудругото се обяснява някъде за 2 минути макс в лекцията.

Благодаря предварително.

Тагове:
1
C# Fundamentals
svephoto avatar svephoto 689 Точки

Здравей, preslavgetov,

 

Tака както си го написал и с добавяне на \b накрая работи и хваща валидните номера, не виждам проблем: \+359([\s|-])2\1[0-9]{3}\1[0-9]{4}\b. И да, имаме нужда от \b накрая, защото това определя границата на израза, т. е. докъде да свършва - валиден номер трябва да завършва точно с 4 цифри без нищо след тях. Ако няма \b изразът хваща и номер +359-2-222-22222, който завършва с 5 цифри както е пояснено и в условието: Add a word boundary at the end of the match to avoid partial matches.

1
17/04/2021 11:19:59
krum_43 avatar krum_43 568 Точки

Как ще хваща кейса +359-2-222-22222 като в регекса имаме [0-9]{4}.

Нещо се губи логиката.

0
svephoto avatar svephoto 689 Точки

Ами тествай го, пробвай и ще видиш. Никак даже не се губи логиката - нали точно това е изрично посочено в условието: to avoid partial matches. Регексът без \b накрая хваща частта от +359-2-222-22222 до 4-тата двойка и след нея накрая остава още една двойка. Идеята е да могат да се хващат целите номера с написания регекс, а не само части от тях. Някой може да сложи още 20 символа след 4-тата четворка и това, че нашият регекс завършва на [0-9]{4} нищо не ни помага за конкретната задача.

1
krum_43 avatar krum_43 568 Точки

Да,разбрах го.

1