2016-04-09 2 views
1

У меня есть строка:Как получить текст из строки, содержащей определенное слово в C#?

в Бостоне в 1690 году Бенджамин Харрис опубликовал Publick Появления И Forreign и Domestick. Это считается первой газетой в американских колониях, хотя только издание было опубликовано до того, как газета была подавлена ​​правительством. В 1704 году губернатор разрешил опубликовать «Бостонское новостное письмо», и он стал первой постоянно издаваемой газетой в колониях. Вскоре после этого в Нью-Йорке и Филадельфии начали издаваться еженедельные газеты. Эти ранние газеты следовали британскому формату и обычно составляли четыре страницы. В основном они получали новости из Великобритании, а содержание зависело от интересов редактора. В 1783 году Пенсильвания Evening Post стала первой американской ежедневной.

Я хочу запрограммировать свою программу, чтобы извлечь только одно предложение из этого текста выше.

Например, если кто-то типа в TextBox слово `губернаторский, выход должен показать:

В 1704 году губернатор позволил Бостонский Новости Письмо будет опубликован и стал первым постоянно публикуется газета колоний.

Я пытался сделать это сам, и я до сих пор код:

string searchWithinThis = "In Boston in 1690, Benjamin Harris published Publick Occurrences Both Forreign and Domestick. This is considered the first newspaper in the American colonies even though only one edition was published before the paper was suppressed by the government. In 1704, the governor allowed The Boston News-Letter to be published and it became the first continuously published newspaper in the colonies. Soon after, weekly papers began publishing in New York and Philadelphia. These early newspapers followed the British format and were usually four pages long. They mostly carried news from Britain and content depended on the editor's interests. In 1783, the Pennsylvania Evening Post became the first American daily."; 
string searchForThis = "governor"; 
int middle = searchWithinThis.IndexOf(searchForThis); 

Моя идея заключается в том, что я мог бы найти первый ". перед словом «губернатор» и последним ». после слова «губернатор», а затем используйте подстроку для извлечения предложения словом «губернатор». Я не знаю, как найти IndexOf первый и последний ». между словом «губернатор».

ответ

2

Aha, регулярное выражение на помощь!

[^\.]*\bgovernor\b[^\.]*

Отрывок: https://regex101.com/r/mB7fM7/2

Код:

static void Main(string[] args) 
{ 
    var textToSearch = "governor"; 
    var textToSearchIn = "In Boston in 1690, Benjamin Harris published Publick Occurrences Both Forreign and Domestick. This is considered the first newspaper in the American colonies even though only one edition was published before the paper was suppressed by the government. In 1704, the governor allowed The Boston News-Letter to be published and it became the first continuously published newspaper in the colonies. Soon after, weekly papers began publishing in New York and Philadelphia. These early newspapers followed the British format and were usually four pages long. They mostly carried news from Britain and content depended on the editor's interests. In 1783, the Pennsylvania Evening Post became the first American daily."; 
    var pattern = String.Format("[^\\.]*\\b{0}\\b[^\\.]*", textToSearch); 

    if (Regex.IsMatch(textToSearchIn, pattern)) 
    { 
     foreach (var matchedItem in Regex.Matches(textToSearchIn, pattern)) 
     { 
      Console.WriteLine(matchedItem); 
      Console.WriteLine(); 
     } 
    } 

    var lastMatch = Regex.Matches(textToSearchIn, pattern).Cast<Match>().Last(); 

    Console.Read(); 
} 

EDIT: улучшен код для согласования слов с использованием \b и Regex.MatchCollection для нескольких матчей.

+0

Ничего себе, он отлично работает! Спасибо. У меня вопрос, что, если слово «губернатор» используется три раза, и я хочу получить последнее предложение этим словом. «В 1704 году губернатор разрешил публикацию« Бостонских новостных писем »и стал первой постоянно издаваемой газетой в колониях (губернатор). Вскоре после этого в Нью-Йорке и Филадельфии начали издаваться еженедельные газеты. формат и, как правило, четыре страницы (губернатор).« И я хочу извлечь только: « Эти ранние газеты следуют британскому формату и обычно состоят из четырех страниц (губернатор) ». – ktos1234

+0

См. Обновленный ответ. Я сделал так, чтобы во-первых он должен был соответствовать слову, а не часть из них, и теперь у вас есть все возможные предложения в коллекции. Вы решаете, какой из них нужно вернуть. – grmbl

+0

Спасибо. Я раньше не слышал о библиотеке Regex, но это очень полезно. – ktos1234

1

Одним из способов может быть разбить строку в последовательности, а затем найти правильный:

var sequence = searchWithinThis.Split('.').FirstOrDefault(s => s.Contains(searchForThis)); 

Это не так оптимизированную, как IndexOf, хотя, так что это может быть проблемой, если у вас есть очень длинный текст.

В противном случае, вы могли бы сделать что-то вроде:

var index = searchWithinThis.IndexOf(searchForThis); 

if (index != -1) 
{ 
    int startIndex = 0; 
    int endIndex = searchWithinThis.Length; 

    for (int i = index + searchForThis.Length; i < searchWithinThis.Length; i++) 
    { 
     if (searchWithinThis[i] == '.') 
     { 
      endIndex = i; 
      break; 
     } 
    } 

    for (int i = index - 1; i >= 0; i--) 
    { 
     if (searchWithinThis[i] == '.') 
     { 
      startIndex = i + 1; 
      break; 
     } 
    } 

    var sequence = searchWithinThis.Substring(startIndex, endIndex - startIndex); 
} 
+0

Этот код также работает, но я решил использовать библиотеку регулярных выражений. Благодарю. – ktos1234

Смежные вопросы