正则表达式,用于单词相似度“ n个字母差异”

时间:2019-02-06 12:40:16

标签: java sql regex mariadb

假设我有一个这样的词; mert 。我想搜索该单词的所有1个字母差异组合。 aert,ert,肉,mmert,merst,merts 等均适用。所以我的正则表达式就像

[a-z]{0,2}ert OR m[a-z]{0,2}rt OR me[a-z]{0,2}t OR mer[a-z]{0,2}

对于n个字母的差异,我只将2替换为n-1,而您不能获得所有组合。

我的问题是这个;有没有更短的编写此正则表达式的方法?

谢谢

2 个答案:

答案 0 :(得分:1)

请检查此解决方案,我已经在下面测试了此代码。它似乎有效。

/**
 * Then function will return list of the words matched with nth_difference
 *
 * @param pattern search pattern
 * @param data input data
 * @param nth_difference difference
 * @return
 */
static List<String> getNthDifferenceWords(String pattern, String[] data, int nth_difference) {
    Map<Character, Integer> frequencyTable = new HashMap<>();
    List<String> matchedWords = new ArrayList<>();
    //Code complexity : O(n)
    for (int i = 0; i < pattern.length(); ++i) {
        frequencyTable.put(pattern.charAt(i), 1);
    }
    //Code complexity : O(m) where m is size of entire input;
    for (String input : data) {
        int matchCounter = 0;
        for (int j=0; j<input.length(); ++j){
            if(frequencyTable.containsKey(input.charAt(j))){
                ++matchCounter;
            }
        }
        //System.out.println("matched=" + matchCounter);
        if(input.length() <= pattern.length() && (matchCounter == pattern.length() - nth_difference)){
                matchedWords.add(input);
        }
        if((input.length() - pattern.length() == 1) && (matchCounter >= input.length() - nth_difference)){
            matchedWords.add(input);
        }
   }
    return matchedWords;
}


    public static void main(String[] args) {
    int nth_difference = 1;
    String pattern = "mert";
    String[] data = new String[]{"aert", "ert", "meat", "mmert", "merst", "merts","meritos"};
    System.out.println(getNthDifferenceWords(pattern,data,nth_difference));

    nth_difference = 2;
    pattern = "merit";
    data = new String[]{"aert", "ert", "meat", "mmert", "merst", "merts","demerit","merito", "meritos"};
    System.out.println(getNthDifferenceWords(pattern,data,nth_difference));
}

答案 1 :(得分:1)

要区分1个字母,请按以下方式预先构建表格。用第二列中的“单词”构建一个2列词典,第一列中包含以下内容:一次定位,从单词中删除一个字母。

示例:“肉”是单词;这是表格中的行:

`col1` `col2`
------ ------
meat   meat
eat    meat
mat    meat
met    meat
mea    meat

对于“满足”(注意重复字母):

meet   meet
eet    meet
met    meet  -- only needed once
mee    meet

然后以类似方式进行测试。搜索“ mert”时,请

WHERE col1 IN ('mert', 'ert', 'mrt', 'met', 'ert')

请注意,您将从上面的示例中同时获得“肉”和“会议”。还要注意“ met”和“ meets”会发生什么。

并且,它检查简单的换位。搜索“元”:

WHERE col1 IN ('meta', 'eta', 'mta', 'mea', 'met')

可以找到“肉”,“满足”(以及诸如met,mean等之类的词语)。可以说,“ meta”->“ mean”是2个字母的距离,但是很好。

检查您的测试用例-Mert vs

aert-通过“ ert”
ert –通过“ ert”
肉-通过“ met”
mmert –通过“ mert”
merst-通过“ mert”
merts-通过“ mert”

同时,在该表上放置PRIMARY KEY(col1, col2), INDEX(col2)