繁体   English   中英

如何检查字符串是否包含单词并忽略特殊字符?

[英]How to check if a string contains a word and ignore special characters?

我需要检查一个句子是否包含字符串数组中的任何单词,但在检查它时应该忽略逗号等特殊字符。 但结果应该有原句。

例如,我有一句话"Tesla car price is $ 250,000." 在我的单词数组中,我有wrdList = new string[5]{ "250000", "Apple", "40.00"};

我写了下面的代码行,但它没有返回结果,因为 250,000 和 250000 不匹配。

List<string> res = row.ItemArray.Where(itmArr => wrdList.Any(wrd => itmArr.ToString().ToLower().Contains(wrd.ToString()))).OfType<string>().ToList();

一件重要的事情是,如果与字符串数组匹配,我需要获取原始句子。

例如,结果应为"Tesla car price is $ 250,000." 不像"Tesla car price is $ 250000."

Replace(",", "")怎么样

itmArr.ToString().ToLower().Replace(",", "").Contains(wrd.ToString())

旁注: .ToLower()不是必需的,因为数字不区分大小写并且字符串不需要.ToString()

所以结果也可能是

itmArr.Replace(",", "").Contains(wrd)

https://dotnetfiddle.net/A2zN0d


更新,可能是基于不同的字符 - 文化,您也可以使用ystem.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberGroupSeparator代替

大多数文本匹配问题要考虑的第一个选项是使用正则表达式。 这将适用于您的问题。 解决方案的核心部分是构建一个适当的正则表达式来匹配您需要匹配的内容。

您有一个单词列表,但我将只关注一个单词。 您的要求指定您要匹配“单词”。 因此,首先,您可以使用“单词边界”模式\\b 要匹配单词“250000”,正则表达式将是\\b250000\\b

您的要求还指定该词可以“包含”“特殊”字符。 为了使其正常工作,您需要清楚“包含”的含义以及哪些字符是“特殊的”。

对于“包含”要求,我假设您的意思是特殊字符可以位于单词中的任意两个字符之间,但不能位于第一个或最后一个字符之间。 因此,对于单词“250000”,该字符串中的任何问号都可以是特殊字符:“2?5?0?0?0?0”。

对于“特殊”要求,有一些选项取决于您的要求。 如果它只是标点符号,则可以使用字符类\\p{P} 如果需要指定特定的特殊字符列表,可以使用字符组。 例如,如果您唯一的特殊字符是逗号,则字符组将为[,]

将所有这些放在一起,您将创建一个函数来为每个目标词构建适当的正则表达式,然后使用它来检查您的句子。 像这样的东西:

public static void Main()
{
    string sentence = "Tesla car price is $ 250,000.";
    var targetWords = new string[]{ "250000", "350000", "400000"};
    Console.WriteLine($"Contains target word? {ContainsTarget(sentence, targetWords)}");
}

private static bool ContainsTarget(string sentence, string[] targetWords)
{
    return targetWords.Any(targetWord => ContainsTarget(sentence, targetWord));
}

private static bool ContainsTarget(string sentence, string targetWord)
{
    string targetWordExpression = TargetWordExpression(targetWord);
    var re = new Regex(targetWordExpression);
    return re.IsMatch(sentence);
}

private static string TargetWordExpression(string targetWord)
{
    var sb = new StringBuilder();
    // If special characters means a specific list, use this:
    string specialCharacterMatch = $"[,]?";
    // If special characters means any punctuation, then you can use this:
    //string specialCharactersMatch = "\\p{P}?";
    
    bool any = false;
    foreach (char c in targetWord)
    {
        if (any)
        {
            sb.Append(specialCharacterMatch);
        }
        any = true;
        sb.Append(c);
    }
    
    return $"\\b{sb}\\b";
}

工作代码: https : //dotnetfiddle.net/5UJSur

希望下面的解决方案可以帮助,

  • 使用正则表达式去除非字母数字字符

  • 如果原始字符串包含来自 wrdList 的任何匹配单词,则返回原始字符串。

     string s = "Tesla car price is $ 250,000."; string[] wrdList = new string[3] { "250000", "Apple", "40.00" }; Regex rgx = new Regex("[^a-zA-Z0-9 -]"); string str = rgx.Replace(s, ""); if (wrdList.Any(str.Contains)) { Console.Write(s); } else { Console.Write("No Match Found!"); }

在小提琴上上传更多探索https://dotnetfiddle.net/zbwuDy

另外对于段落,可以拆分成句子数组并遍历。 在下面的小提琴上检查相同的内容。 https://dotnetfiddle.net/AvO6FJ

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM