我如何使用正则表达式来实现包含功能?

时间:2018-06-21 11:34:40

标签: java regex algorithm

P.S:If you don't understand anything from the below I describe, please ask me

我有一本包含单词列表的字典。 而且我有一个单词的字符串,其中包含多个字符。

例如:词典=>

String[] = {"Manager","age","range", "east".....} // list of words in dictionary

现在我有一个字符串tageranm

我必须在字典中找到所有可以使用此字符串制作的单词。我已经可以使用Permuation创建所有字符串并找到该字符串,并验证字典中是否存在该字符串。

但是我有另一种解决方案,但是一点也不知道如何使用 Regex

在Java中完成此操作

算法:


// 1. Sort `tageranm`. 

char c[] = "tageranm".toCharArray();

Arrays.sort(c);

letters = String.valueOf(c); // letters = "aaegmnrt"

2.Sort all words in dictionary:

Example: "range"  => "aegnr"  // After sorting

现在,如果我将使用"aaegmnrt".contains("aegnr")将返回false。 'm'介于两者之间。

是否可以使用正则表达式忽略字符m并使用上述方法获得字典中的所有单词?

先谢谢了。

1 个答案:

答案 0 :(得分:2)

使用@MattTimmermans in the comments所述的正则表达式类型是可行的解决方案。不过,它的速度不是很快,因此可能有很多方法可以改善此问题。.我也很确定应该有针对此类搜索的库,(有希望)它将使用降低性能的算法。

java.util.List<String> test(String[] words, String input){
  java.util.List<String> result = new java.util.ArrayList<>();

  // Sort the characters in the input-String:
  byte[] inputArray = input.getBytes();
  java.util.Arrays.sort(inputArray);
  String sortedInput = new String(inputArray);

  for(String word : words){
    // Sort the characters of the word:
    byte[] wordArray = word.getBytes();
    java.util.Arrays.sort(wordArray);
    String sortedWord = new String(wordArray);

    // Create a regex to match from this word:
    String wordRegex = ".*" + sortedWord.replaceAll(".", "$0.*");
    // If the input matches this regex:
    if(sortedInput.matches(wordRegex))
      // Add the word to the result-List:
      result.add(word);
  }

  return result;
}

Try it online (with added DEBUG-lines to see what's happening).

对于您的输入{"Manager","age","range", "east"}"tageranm",它将返回["age", "range"]

编辑:与Manager不匹配,因为M大写。如果要使用不区分大小写的匹配,最简单的方法是在检查之前将输入和单词转换为相同的大小写:

  • input.getBytes()成为input.toLowerCase().getBytes()
  • word.getBytes()成为word.toLowerCase().getBytes()

Try it online(现在是["Manager", "age", "range"])。