簡體   English   中英

如何檢查字符串中存在的任何單詞列表?

[英]How to check any of the list of words present in the string?

我有單詞列表,我需要檢查列表中的任何單詞是否存在於字符串中,但字符串中的單詞可以是任何格式,假設我有單詞列表{:carloan:,creditcard}但在字符串中它可以像car-loancarloan:carloan中的任何一種格式。

我在 java 中使用 lambda 函數來查找任何接近的匹配項,但它的工作方式如下:

List<String> list = new ArrayList<>();

list.add(":carloan:")
list.add(":creditcard:")
String inputString = "i want carloan"
boolean match = list.stream().anyMatch(s -> inputString.contains(s));

但只有當子字符串與列表中的單詞完全相同時,上述方法才給出布爾值true

有沒有辦法即使它部分匹配,我也可以給出 true 假設用戶輸入了car-loan但在列表中它就像:carloan:我不想在列表上使用迭代並進行匹配。 請建議我在java中使用lambda函數的方法。

您可以在此處使用正則表達式方法:

List<String> list = new ArrayList<>();
list.add("carloan");
list.add("creditcard");

String regex = ".*(?:" + String.join("|", list) + ").*";
String input = "I am looking for a carloan or creditcard";
if (input.matches(regex)) {
    System.out.println("MATCH");
}

您可能希望對上述內容進行一些可能的更改是在交替周圍添加單詞邊界。 也就是說,您可能想要使用此正則表達式模式:

.*\b(?:carloan|creditcard)\b.*

這將避免匹配例如carloans當你真的想只有單數完全匹配carloan

編輯:

這是一個使用正則表達式的版本,更接近您的原始起點:

boolean result = list.stream().anyMatch(s -> input.matches(".*\\b" + s + "\\b.*"));
if (result) {
    System.out.println("MATCH");
}

我們可以流式傳輸您的術語列表,然后使用正則表達式斷言輸入字符串是否與任何術語匹配。 但請注意,這種方法意味着調用String#matches N 次,對於 N 個術語的列表,而上述方法只是對該 API 進行一次調用。 我敢打賭交替方法在這里更有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM