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

Regular Expressions - Exercises in class

Здравейте!

Малко ми е трудно с регулярните изрази и да ви попитамза тези 2те задачи.

1-ва

Това което успявам да направя е да извадя Ivan Ivanov; Ivan Iv; Van Ivanov.

Вярно е че са спазени правилата по общо погледнато, няма 2 главни букви в име и т.н., но все пак нали трябва да се покаже като отговор единствени Иван Иванов ? Защото това не знам как да го напрвя

Пробвах да добавя  условие  според което преди главна буква да няма главна буква и в същото условие след главна буква да няма главна буква за да ги пропусне тези, но не ми се получи. Код от рода на ?<!А-Z  и  ?!=A-Z

 

2ра 

нещо подобно, примера в който има 1 цифра повече ми го вади отново без нея, т.е. имам 3 оутпут-а. Трябва ли да скрия последния и как ? 

 

Отделно от тях само, ако може да ми обясни някой как работи този код за 1ва от домашната,  какво прави $1 ? Знам че $ е край на стирнга но като го пробвам в регекс101 нищо не разбирам.. 

string input = Console.ReadLine();
  string pattern = @"(\w)\1+";
  string replacement = "$1";
  string result = Regex.Replace(input, pattern, replacement);
  Console.WriteLine(result);

 

 

 

Благодря!

Тагове:
0
Fundamentals Module 28/09/2015 14:31:01
kidroca avatar kidroca 117 Точки
Best Answer

Здравей,

Ще ти покажа какъв регекс ползвах аз и какво прави:

За задачата с имената (1):

\b[A-Z][a-z]+?[ ][A-Z][a-z]+?\b

\b = word boundry

слага се когато искаш на това място да няма буква или цифра 

в случея го слагам в началото за да подсигуря че винаги се започва от началото на дума (преди нея няма буква или цифра)

[A-Z] = една главна буква от А до Z

[a-z]+?[ ]  

[a-z] = малка буква от a до z

+?[ ] = избира един или колкото може символи докато не срещне първият елемент от вида [ ]

[ ] = празно място с размер на един 'space'

Историята се повтаря и завършва със \b 

[a-z]+?\b = избира един или колкото може символи докато не срещне първият елемент от вида \b

Надявам се си разбрал каква е логиката зад +? 


За задачата с телефоните (2):

(?<=[ ]|^)\+\d{3}(-|[ ])[\d]\1\d{3}\1\d{4}\b

(?<=[ ]|^) = търси само в случейте че предходният елемент е 'space' или началото на нов ред

\+ = знакът '+'

\d{3} = 3 цифри

(-|[ ]) = група която покрива или знакът '-' или 'space'

[\d] = една цифра (може и просто \d без квадратните скоби)

\1 = представлява групата от по - горе, но със конкетния избран символ ('-' или 'space')

нататък е аналогично , завършва със \b за да се подсигури това че след последните 4 цифри не продължават още цифри.


Относно 3тия ти въпрос:

string pattern = @"(\w)\1+";
string replacement = "$1";
string result = Regex.Replace(input, pattern, replacement);

Console.WriteLine(result);

това "$1" се използва извън регекс-а и няма нищо общо със $ което се използва за край на реда/стринга във самият регекс.

"$1" означава че искаш да избереш група 1 от вече Match()-нат регекс, 

в случея по - горе $1 сочи към (\w).

преведен примера означава 

pattern = мачни ми този израз и запомни една група с номер 1

replacement = "$1" ( за сега само string )

Regex.Replace(даденТекст, от който Match-вай pattern, и замени всeки Маtch със replacement) - тук вече replacement придобива смисълът на 1 група от pattern (в случей че няма такава мисля че нищо не се replace-ва)

Какво всъщност става в действителнйост 

ако даденTeкст = "aaaa"

pattern ще избере пътвото 'а' и ще го сложи във група номер 1, след това ще продължи да Match-ва докато следващия символ е равен на симовола в група номер 1

след това целия match ('aaaa') ще се замени от символа който е хванат във група 1 (а) 

С 2 думи целият match вместо да се замени със string подаден от вън се заменя с малка част от себе си


 

4
28/09/2015 16:01:28
cap7ainjack avatar cap7ainjack 20 Точки

Перфектен!

Мерси, поразбрах го по-добре сега групирането и как се позлва.

1