如何在2个不同的长ArrayLists之间找到2个字符串的最佳匹配

时间:2016-07-21 07:37:05

标签: java regex string

让我们说,我已经说了2个名单:

A = { "ABC" , "DEF" , "JKL"};

在其他一些项目中有第二个清单:

A = { "ABC.com" , "DEF" , "JKL" };

现在ABC和ABC.com是相同的,因为我在手动看到之后就知道了。但是列表包含10000或100万个条目。我需要在另一个列表中找到String ABC的最佳匹配,因为没有固定的模式,它必须有.com,它可能是.inc或类似的东西,并且它确定,没有其他条目将其中有ABC,因为实际上它是设备的型号名称。例如,它将类似于“Cisco”和“Cisco.Inc”。

为2个字符串找到最佳匹配的最佳策略或正则表达式是什么?

3 个答案:

答案 0 :(得分:5)

您需要定义一个函数来了解"距离"在两个字符串之间。

基本上你需要一个在输入中带两个字符串并返回表示距离的值的函数。比较不同的距离,您可以找到最相似的字符串。

距离函数的一个例子是Levenshtein函数。

Here您可以找到实现Levenshtein函数的不同语言的函数。以下代码是从该站点获取的java实现:

public class LevenshteinDistance {                                               
    private static int minimum(int a, int b, int c) {                            
        return Math.min(Math.min(a, b), c);                                      
    }                                                                            

    public static int computeLevenshteinDistance(CharSequence lhs, CharSequence rhs) {      
        int[][] distance = new int[lhs.length() + 1][rhs.length() + 1];        

        for (int i = 0; i <= lhs.length(); i++)                                 
            distance[i][0] = i;                                                  
        for (int j = 1; j <= rhs.length(); j++)                                 
            distance[0][j] = j;                                                  

        for (int i = 1; i <= lhs.length(); i++)                                 
            for (int j = 1; j <= rhs.length(); j++)                             
                distance[i][j] = minimum(                                        
                        distance[i - 1][j] + 1,                                  
                        distance[i][j - 1] + 1,                                  
                        distance[i - 1][j - 1] + ((lhs.charAt(i - 1) == rhs.charAt(j - 1)) ? 0 : 1));

        return distance[lhs.length()][rhs.length()];                           
    }                                                                            
}

您可以按照以下方式使用它:

public String mostSimilar(String toBeCompared, String[] strings) {
    int minDistance = Integer.MAX_VALUE;
    String similar = null;
    for (String str : strings) {
        int d = LevenshteinDistance.computeLevenshteinDistance(str, toBeCompared);
        if (d < minDistance) {
            minDistance = d;
            similar = str;
        }
    }
    return similar;
}

Here一个完整的字符串度量函数列表。

答案 1 :(得分:4)

有一些非常好的算法可以解决比较两个字符串(字符串相似性masures )之间的相似性的任务,例如:

  1. Dice's coefficient
  2. Overlap similarity
  3. Levenshtein distance
  4. Cosine similarity
  5. Jaccard similarity
  6. Jaro-Winkler distance
  7. (...)
  8. 所有这些都有其优点/缺点。还有一个Github Repository具有预先实现的相似/距离测量算法。它有很好的文档记录,并提供各种不同的算法。这绝对是一个值得关注的起点。

    在这里,您将找到Wikipedia list,并进一步参考更多相似度算法。

答案 2 :(得分:0)

你的正则表达式会是这样的:

String s = "ABC";
String pattern = s + "(\.(com|uk|inc|biz|me|<put other domains here>)?)?"

编辑:根据评论中的讨论:

String s = "ABC";
String pattern = s + ".*"