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


8

Условие: Write a program that extracts from a given text all sentences containing given word.

Example: The word is "in". The text is:

We are living in a yellow submarine. We don't have anything else. Inside the submarine is very tight. So we are drinking all the day. We will move out of it in 5 days.

The expected result is:

We are living in a yellow submarine.
We will move out of it in 5 days.

Consider that the sentences are separated by "." and the words – by non-letter symbols.

Решениеsource.

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

P.S. Подобно на 4 задача.




Отговори



5

Решение:

http://pastebin.com/Smz01Fq0

Обяснение:

    Задачката стана малко сложна, но така е без регулярен израз. Идеята ми е първо да намеря от кой index[ ] до кой index[ ] има изречение, като съобразявам, че едно изречение  е между две точки "." или м/у index[0]  и точка "." . След това проверявам м/у startIndex и endIndex дали има има дума "in" ако да я изписвам.

  1. Правя си метод. В него създавам 2 променливи - startIndex, endIndex равни на 0.
  2. Пускам for  цикъл до str.Length (като str е текста запазен в string).
  3. Ако имам substring който е точка"." && startIndex < i присвоявам на endIndex= i -1 (за да знам каде свършва изречението)
  4. Пускам втори for цикъл до k <= endIndex като с него обхождам вече изречението.
  5. ВАЖНО е да се определят всички варианти на "in" в който е значеща дума. В случая има 3 варианта:
  • Когато преди и след "in" има разстояние.
  • Когато преди "in" има точка "." а след разстояние - (в началото на изречение).
  • Когато пред "in" има разстояние а след него има точка "."

Ако един от 3-те варианта е True принтя на конзолата Console.WriteLine(str.Substring(startIndex, length + 2).Trim()); като          length = endIndex - startIndex

 

EDIT: Вече работи когато "in" е Zero-Based

 

Асси


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


0
Ако in е в началото на първото изречение гърми.


0
В условието е подсказано да се използва Char.isLetter(). Според указнията in е дума във всеки случай, когато от двете му страни непосредствено няма букви.

от loloto (1073 точки)


2

Решението ми е с регулярен израз.

Първо разделям текста на масив от изречения, като разделител е точката.

След това обхождам всяко изречение и го принтирам само ако броя на думата, която търсим е по-голям от нула в това изречение.

израза \bin\b показва, че думата in я искаме само цялата.

Пробвах и с IndexOf, но всички изречения съдържат in като substring, и затова се отказах от този вариант.

Всъщност сега ми хрумва, може би е възможен вариант без регулярен израз, като с IndexOf търсим " in ", т.е. in, оградено с  интервали.

http://pastebin.com/BY0nr80r




0
Хубаво решение. Понеже и моето е подобно, ако думичката е най-отпред и с главни букви няма да вземе изречението за печат. Ако се преправи if (Regex.Matches(sentences[i],@"\b"+word+@"\b").Count>0) на if (Regex.Matches(sentences[i],@"\b"+word+@"\b",RegexOptions.IgnoreCase).Count>0) ще хване и тези случаи ;)

от sylviapsh (302 точки)

0
Също така @"\b"+word+@"\b" трябва да се преправи на @"\b"+word+@"\b\.?", за да може да го взима дори ако е в края на изречението. Браво за решението!!!



2

Решение: http://pastebin.com/23ESeRRQ

Обяснение:

Без използване на регулярни изрази.

1. Делим текста на масив от изречения с 

string[] sentences = text.Split('.');

2. Търсим във всеки елемент на масива/изреченията дали има стринг " in "

и ако има го печатаме с Trim() който мяха whitespaces в началото на стринга.


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


0
решението няма да отпечата We are living in. тъй като стринга който търсиш е " in ", и така изпускаш случая , когато около думата има точка или запетая или някакъв друг символ. В условието е подсказано, че думите са оградени от небуквени символи, а не само от интервали.

от pdrenovska (2196 точки)


1

Моят вариант с регулярни изрази: http://pastebin.com/SH9G7YZu като съм направил да match-ва независимо дали е с главна или малка буква.


от Mitko_Mitev (1276 точки)


1
Някой знае ли как работи, този метод, защото на мен ми е странен. В момента ми работи по следния начин, който е малко объркващ:
Ако думата ми я няма в текста връща ми връща 0, не -1, ако я има някъде посредата си и намира правилния индекс, ако е в началото т.е. 0, отново си връща 0...което по принцип е правилно, но защо като я няма също ми връща нула, а не отрицателно.? Благодаря!

int wordIndex = (Regex.Match(text.Substring(movingIndex, length), @"\b(in)\b").Index);

от boncho.vylkov (1923 точки)


0
Погледни тук как са го обяснили: http://www.dotnetperls.com/regex-match
Идеята е, че намира група и започва индексирането на тези групи от 1. Затова ако не го открие връща 0.
Стандартно сме свикнали индексите да започват от 0 и тогава като не ги намери връщат -1.
С малко по-специално поведение е Regex.Match

от sylviapsh (302 точки)


0

http://pastebin.com/gBHXxhxY

Обяснение: 

1) Правя цикъл за обхождане на целия текст

2) Разделям на изречения, чрез намиране на индекса на точката, която разделя текста на изречения.

3) Проверявам с регулярен израз във всяко изречение дали има думата, която търся (true e само когато пред думата има интервал и след думата има интервал или точка).

4) Отпечатвам когато намеря изречение с думата, която търся.


от SVGN_H (3048 точки)


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

от pdrenovska (2196 точки)


0

Решение с метод, който връща индексите на изреченията, които съдържат думичката. С регулярен израз и опция за игнориране на регистъра на думите търся думичката.


http://pastebin.com/xxm1m4j6


от sylviapsh (302 точки)


0

Ето и моето решение http://pastebin.com/QHNQsxND . Усложних си задачата, като вкарах нови редове в входа, И след това с регулярни изрази и опции си изведох търсените изречения. И накрая върхо колекциите прилагам Replace метода за да махно символите за нов ред.


от AsenVal (3487 точки)


0

Здравейте , малко ме изпоти тази задача и тъй като както някой колеги тези регуларни изрази още не съм ги усвойл действах с познанита нещата които сме учили дотук. Съответно молбата ми е ако някой може да погледне решението и да каже дали неизпускам нещо! Мерси!

След бърза и козметична промяна.

http://pastebin.com/d8tzuZMn


от Svetli (280 точки)


0
Може да обединиш първите два реда от цикъла по този начин: var splitWhiteSpaces = splitedTextByDots[i].Split(' ');

от jasssonpet (6814 точки)

0
Благодаря за своевременната намеса! Да наистина може да се оптимизира още малко! Нарочно не съм гледал другите решение, но съм сигурен, че твоето е на не повече от 2 реда :).

от Svetli (280 точки)



0
Работи, кодът не е дълъг, но пак както в повечето задачи като ги решаваш за първи път си има и подводни камани :
Триябва да се обърне спец. внимание на първото изречение и по-точно на първата дума което съм направил с още едно ифче, както и на последните думи на всяко изречение, защотослед тях няма интевал, а точка, което си още едно условие или в моя слуайе.
Решение :
http://pastebin.com/Jqt31XRP

от Al.polichronov (1567 точки)