需要正则表达式来匹配给定单词的所有排列

时间:2017-04-13 13:07:37

标签: java regex algorithm pattern-matching sliding-window

我正在解决一个问题,我需要匹配目标字符串中给定单词的不同的不区分大小写的排列。

例如:

匹配的词:cAda

目标字符串:AbrAcadAbRa

此处,目标字符串S中可以找到的两种可能的排列是Acad和cadA。

我写过这样的话:

    String pattern = "" ;

    for(char ch : word.toCharArray()){
        pattern = pattern + "(?=[\\s\\S]*(" + ch + "))" ;
    }
    pattern = "^" + pattern + "*$";

    Pattern r = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);

它不起作用。

1 个答案:

答案 0 :(得分:0)

正则表达式不是此任务的最佳工具。您必须为每个输入词生成一个新的正则表达式。并非不可能,但过于复杂。

你最好对目标词的字母进行排序,然后对输入词的每个n长度子串,对字母进行排序,看它们是否与排序的目标词匹配。

因此,给定目标词“cAda”,您将其排序为“Aacd”。

用户输入“AbrAcadAbRa”

所以你拿第一个4个字母的子串“AbrA”,将它排序为“AAbr”,然后根据已排序的目标进行检查。没有比赛。然后拿“brAc”,排序并检查。然后是“Acad”等。

有一些潜在的优化可以避免排序,但是对于小字符串,它们可能并不重要。