假设我有关键词的列表,大约30-40,我想在很长的文本中找到所有/任何这些单词,我们只需要几千个单词。
只有我的想法 - 使用多个正则表达式并添加匹配List<string>
。
有没有更好的解决方案?
P.S。这些关键词可能在文本中被分开以及一个接一个地分开 P.P.S.例如,这是来自维基百科的文本。
我需要找到单词:“莎士比亚”,“英语”,“语言”。
威廉莎士比亚(ʃeɪkspɪər/; [1] 1564年4月26日(受洗) - 1616年4月23日)[nb 1]是一位英国诗人,剧作家和演员,被广泛认为是英语中最伟大的作家和世界上杰出的剧作家。[2]他经常被称为英国的国家诗人和“雅芳的吟游诗人”。[3] [nb 2]他的现存作品,包括一些合作,包括约38部戏剧,[nb 3] 154首十四行诗,两首长篇叙事诗,以及其他一些经文,其中一些的作者身份尚不确定。他的戏剧已被翻译成各种主要的生活语言,并且比其他任何剧作家都更频繁地表演。[4] 莎士比亚出生并在埃文河畔斯特拉特福(Stratford-upon-Avon)长大。在18岁时,他与安妮·海瑟薇结婚,他有三个孩子:苏珊娜,双胞胎哈姆奈特和朱迪思。 1585年至1592年间,他在伦敦开始了一个成功的职业生涯,作为一个演员,作家和一个名为Lord Chamberlain's Men的演奏公司的部分所有者,后来被称为King's Men。他似乎已于1913年左右在49岁时退休到斯特拉特福德,三年后他去世了。很少有莎士比亚的私人生活记录存在,并且对于他的外貌,性行为,宗教信仰以及归于他的作品是否由其他人撰写等问题有相当多的猜测。[5] 莎士比亚在1589年至1613年期间创作了他大部分已知的作品。[6] [nb 4]他的早期戏剧主要是喜剧和历史,这些作品仍然被视为这些类型中最好的作品。然后,他主要写了悲剧,直到大约1608年,包括哈姆雷特,李尔王,奥赛罗和麦克白,被认为是一些英语最好的作品。在他的最后阶段,他写了悲剧,也被称为浪漫,并与其他剧作家合作。
答案 0 :(得分:4)
如果你想要一个字符串中包含的关键字列表,那么这样的事情就可以了:
var results = myKeywordList.Where(k => myBigLongString.Contains(k));
您也可以使用Any
代表布尔结果,或使用Count
代替Where
这是显示结果的fiddle。
如果您想使其不区分大小写,请在长字符串上使用ToLower
并k
答案 1 :(得分:1)
您可以使用正面和负面的外观断言,如下所示。
@"(?<!\S)(?:Shakespeare|English|Language)(?!\S)"
添加(?i)
修饰符以进行不区分大小写的匹配。
@"(?i)(?<!\S)(?:Shakespeare|English|Language)(?!\S)"
P.S。这些关键词可能在文本中被逐字分开,也可以一个接一个地分开。
@"(?i)(?<=^|[,\s])(?:Shakespeare|English|Language)(?=[,\s]|$)"
答案 2 :(得分:1)
您正在寻找IndexOf
int pos = mytext.IndexOf("Shakespear");
if(pos >= 0){ /*Shakespear found*/ } else {/*Shakespear not found*/}
使用IndexOf将为您提供起始位置,使您可以使用Substring方法提取字符串并根据需要对其进行操作。
答案 3 :(得分:1)
您可以使用转义单词列表构建子表达式 喜欢
(伪代码)
string rx_list = "(" + RregEscape( MyArray.join("|") ) + ")";
然后,Dot-Net可以表达是/否条件。
使用该信息,您可以将'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
)