簡體   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