2014-12-19 33 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