2014-12-19 58 views
-2

假設我有關鍵詞的列表,大約30-40,並且我想在很長的文本中找到所有/任何這些單詞,讓我們談談幾個數千字。 唯一的想法 - 使用多個正則表達式並將匹配添加到List<string>。 有沒有更好的解決方案?在長字符串中搜索大量單詞

P.S.這些關鍵詞可能在整個文本中被昏迷分離以及逐個分離。
P.P.S.舉個例子,這是維基百科的文字。

我需要找到單詞:「莎士比亞」,「英語」,「語言」。

威廉·莎士比亞(/ʃeɪkspɪər/ [1] 1564年4月26日(受洗) - 1616年4月23)[注1]是一位英國詩人,劇作家和演員,被廣泛認爲是最偉大的作家英語和世界頂尖的劇作家。[2]他經常被稱爲英國的民族詩人和「雅芳的吟遊詩人」[3] [nb 2]。他現存的作品,包括一些合作作品,包括約38部戲劇,[154]十四行詩,兩首長敘事詩和一首其他幾節經文,其中一些詩歌的作者是不確定的。他的劇本已被翻譯成每一種主要的生活語言,並且比其他任何劇作家的表演更頻繁。[4] 莎士比亞出生在埃文河畔斯特拉特福。 18歲時,他娶了安妮海瑟薇,他與三個孩子:蘇珊娜和雙胞胎哈姆奈特和朱迪思。 1585年至1592年間,他在倫敦開始了一段成功的職業生涯,作爲演員,作家和一個名爲張伯倫勳爵的男演員,後來被稱爲國王的男人。他似乎在49歲時在1613年左右退休到斯特拉福,三年後他去世。很少有關莎士比亞私人生活的記錄能夠存活下來,並且對於他的外表,性,宗教信仰以及歸因於他的作品是否是其他人寫的這些問題,都有相當多的猜測[5]。 莎士比亞在1589年至1613年間創作了大部分他的着作。[6] [nb 4]他的早期劇本主要是喜劇和歷史,這些作品仍然被認爲是這些流派中最好的作品之一。然後他主要寫了悲劇,直到1608年左右,其中包括哈姆雷特,李爾王,奧賽羅和麥克白,他們認爲這些作品是英語的一些最好的作品。在他的最後階段,他寫了悲劇,也被稱爲浪漫史,並與其他劇作家合作。

+0

一個例子會更好。 –

+1

你想讓你的結果看起來像什麼?有索引的詞在哪裏被發現?或者只是一個是/否? – Jonesopolis

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

4

如果你想包含在一個字符串的關鍵詞列表,像這樣的工作:

var results = myKeywordList.Where(k => myBigLongString.Contains(k)); 

您還可以使用Any,爲布爾結果,或Count的數量,而不是的Where

這裏是一個fiddle顯示結果。

如果你想讓它不區分大小寫使用ToLower的長字符串和k

+0

據我所知k是關鍵詞數組?如何將每個匹配詞添加到列表? –

+0

k是列表中的每個關鍵字。所以它會搜索你的字符串中的每個關鍵字。 – paqogomez

+0

@ andrey.shedko'results'將是您文本中存在的所有關鍵字。 – paqogomez

1

你可以使用正面和負面的環視斷言像下面。

@"(?<!\S)(?:Shakespeare|English|Language)(?!\S)" 

添加(?i)修飾符以便執行不區分大小寫的匹配。

@"(?i)(?<!\S)(?:Shakespeare|English|Language)(?!\S)" 

DEMO

附:這些關鍵詞可能在整個文本中被昏迷分離以及逐個分離。

@"(?i)(?<=^|[,\s])(?:Shakespeare|English|Language)(?=[,\s]|$)" 
+1

謝謝。這可能也會訣竅,但我更喜歡LINQ方式。 –

1

您正在尋找的IndexOf

MSDN

Perls Example

int pos = mytext.IndexOf("Shakespear"); 

if(pos >= 0){ /*Shakespear found*/ } else {/*Shakespear not found*/} 

使用的IndexOf會給你的起始位置,這將使您能夠使用Substring方法提取字符串並根據需要操作它們。

1

您可以使用轉義單詞列表構造一個子表達式。

(僞代碼)
string rx_list = "(" + RregEscape(MyArray.join("|")) + ")";

然後,斑點網可以做表達是/否條件句。
使用該信息,您可以將'rx_list'子表達式包裝爲邊界仲裁表達式

string regex_final = @"(?(?=\w)\b|\B)" + rx_list + @"(?(?<=\w)\b|\B)";

實施例的正則表達式字符串結果:

# (?(?=\w)\b|\B)(Shakespeare|English|Language)(?(?<=\w)\b|\B) 

(?(?= \w)   # Conditional, is next letter a word 
     \b     # yes, word boundry 
    | \B     # no, not word boundry 
) 
(     # (1 start) 
     Shakespeare 
    | English 
    | Language 
)     # (1 end) 
(?(?<= \w)   # Conditional, was prev letter a word 
     \b     # yes, word boundry 
    | \B     # no, not word boundry 
) 
+0

感謝這樣的擴展答案。 –

+0

@ andrey.shedko - 沒問題。到目前爲止,這是最快的方法。 – sln