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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.