【问题标题】:regex find exact word/sentences match正则表达式查找确切的单词/句子匹配
【发布时间】:2017-01-11 15:25:45
【问题描述】:

我有一个带有 "impportent words" 的 linq 列表,其中包含句子和单个单词。

我需要查找"sentence_to_search_for_importent_word"中的importent_words中是否有任何单词或句子

最后结果应该以数组或其他形式结束。

这是我在知道之前所做的事情..

List<string> importent_words = new List<string>() {"age", "what is", ".", "pages"}

string sentence_to_search_for_importent_words = "what is your age.";

我需要在一个句子中找到importent_words,并将所有匹配项输出到一个列表中

我尝试了这个,但它并没有真正完成这项工作

var pattern = new Regex(@"\w+");
var qa = pattern.Split(first_sentence.ToLower()).Where(w => importent_words.Contains(w));

它必须返回“age”而不是“ages”,它还应该找到“what is”而不仅仅是“what”

使用\w 似乎可以找到年龄,但它只输出"this" 而不是"this is"

问题似乎在于“这是”不止一个词。

【问题讨论】:

  • 您在寻找importent_words.Where(x =&gt; sentence.Contains(x))吗?为什么是正则表达式?
  • 我同意,使用正则表达式会带来第二个问题,你不是在寻找模式,所以基本检查会好十倍
  • 我只是觉得正则表达式很快,任何解决方案都一样好也很棒

标签: c# regex


【解决方案1】:

如果您要查找的只是句子中出现的重要单词,那么您可以使用

importent_words.Where(x => sentence.Contains(x))

如果这需要不区分大小写,那么您可以从Case insensitive 'Contains(string)' 的答案中找到Contains(x) 的替代品(或使用sentence.ToLower(),如您在当前正则表达式尝试中所示)

【讨论】:

    【解决方案2】:

    以防万一您想要一个可扩展的正则表达式解决方案。需要为正则表达式模式转义匹配项。您可以为此使用 Regex.Escape()。

    List<string> importent_words = new List<string>() { "age", "what is", @"\.", "ages", "bob" };
    string sentence_to_search_for_importent_words = "what is your age. Frank";
    string regexString = string.Join("|" , importent_words.ToArray());
    Regex wordRegex = new Regex(regexString);
    
    string[] result = wordRegex.Matches(sentence_to_search_for_importent_words)
        .Cast<Match>()
        .Select(m => m.Value)
        .ToArray();
    

    【讨论】:

    • @"\." 是什么意思做
    • @ 在 C# 中的字符串转义字符之前,因此 \ 将按原样写入。需要给正则表达式\。因此句点被视为句点,而不是“任何单个字符”。
    • 非常感谢。很有意义。以前从未在正则表达式中理解过 exscape 一词。
    猜你喜欢
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 2016-12-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多