2016-04-09 16 views
1

Ben bir dize vardır: 1690 yılında Boston'daC# 'de belirli bir sözcük içeren dizeden metin nasıl alınır?

Benjamin Harris Publick Geçiş Hem Forreign ve Domestick yayınladı. Bu, gazetenin hükümet tarafından bastırılmasından önce sadece bir baskının yayınlanmış olmasına rağmen, Amerikan kolonilerindeki ilk gazete olarak kabul edilir. 1704'te vali, Boston Haber Mektubunun yayınlanmasına izin verdi ve kolonilerde sürekli yayınlanan ilk gazete oldu. Kısa bir süre sonra haftalık gazeteler New York ve Philadelphia'da yayınlanmaya başladı. Bu ilk gazeteler İngiliz formatını takip ediyordu ve genellikle dört sayfa uzunluğundaydı. İngiltere’den en çok haberleri ve editörün çıkarlarına bağlı içeriği içeriyorlardı. 1783 yılında Pennsylvania Evening Post, ilk Amerikan gazetesi oldu.

Programımı kodlamak için yukarıdaki bu metinden yalnızca bir cümle ayıklamak istiyorum.

Örneğin, TextBox kelimesine 'vali' birisi tipi, çıkış göstermesi gerekir eğer: 1704 yılında

, vali Boston Haber-Letter yayınlanacak izin ve ilk sürekli yayınlanan gazete oldu koloniler.

Kendim yapmaya çalıştık ve şu ana kadar kod ettik: ''

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); 

Benim fikrim ben ilk bulabildiğim yani, 'vali' kelimesinden önce ve son '.' 'vali' kelimesinden sonra ve 'vali' sözcüğü ile cümlenin çıkarılması için alt diziyi kullanın. IndexOf'u ilk ve son olarak nasıl bulacağımı bilmiyorum. 'vali' sözcüğü arasında.

cevap

2

Aha, kurtarmaya regex:

Aksi takdirde, böyle bir şey yapabilirdi!

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

Pasajı:

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(); 
} 

DÜZENLEME: \b ve çoklu eşleşen bir Regex.MatchCollection kullanarak kelime eşleştirme için kod geliştirilmiş Kod

https://regex101.com/r/mB7fM7/2.

+0

Vay, Mükemmel çalışıyor! Teşekkür ederim. Bir sorum var, ya 'vali' kelimesi üç kez kullanılıyorsa ve bu kelimeyle son cümleyi almak istiyorum. "1704 yılında vali, Boston Haber Mektubunun yayınlanmasına izin verdi ve kolonilerdeki (vali) ilk sürekli yayınlanmış gazete oldu.Yakın sonra, haftalık gazeteler New York ve Philadelphia'da yayınlanmaya başladı. format ve genellikle dört sayfa (vali) idi." Ve sadece ayıklamak istiyorum: " Bu ilk gazeteler İngiliz biçimini izledi ve genellikle dört sayfa uzunluğundaydı (vali). " – ktos1234

+0

Güncelleştirilmiş yanıtı görüyorum. İlk önce bu sözcükle eşleşmeli ve Bunun bir parçası ve şimdi koleksiyondaki tüm olası cümleler var. Hangisinin geri vereceğine siz karar veriyorsunuz. – grmbl

+0

Teşekkür ederim. Daha önce Regex kütüphanesi hakkında bir şey duymadım, ama çok yararlı. – ktos1234

1

bir yolu daha sonra sağa birini bulunca, diziler halinde dize bölmek olabilir:

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

olsa IndexOf olarak optimize edilmemiş olarak, bu yüzden çok uzun bir metin varsa bir sorun olabilir.

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

Bu kod da çalışır, ancak regex kitaplığı kullanmaya karar verdim. Teşekkürler. – ktos1234

İlgili konular