Java 模式包含数组中的所有字符串

Java pattern contain all strings in the array

我想检查一个长字符串是否包含多个字符串。

我正在尝试使用以下命令。

          String[] words = {"GAGGAG", "AGGAC"};
          Pattern pattern = Pattern.compile("GAGGAG|AGGAC");
          if(pattern.matcher("GAGGAGGTC").find()){
                 System.out.println("find");
          }else{
                 System.out.println("Not find");
          }

结果应该是找不到 因为 "GAGGAGGTC" 包含 "GAGGAG" 但不包含 "AGGAC"

我怎样才能将选项从 "or" 改为 "And"

还有一个选项。

          String[] words = {"GAGGAG", "AGGAC"};
          Pattern pattern = Pattern.compile("GAGGAG|AGGAC");
          if(pattern.matcher("GAGGAGGAC").find()){
                 System.out.println("find");
          }else{
                 System.out.println("Not find");
          }        

这也应该显示"Not find"。 因为不允许重叠部分。 "GAGGAG" 和 "AGGAC" 与 "GAGGAGGAAC"

的 "AG" 部分重叠

将 "and" 运算符的正则表达式更改为此

(?=GAGGAG)(?=AGGAC)

为此您不需要正则表达式。

使用String#contains:

public boolean checkContainsAll(String sentence, String[] words) {
    for(String word : words) {
        if(!sentence.contains(word)) {
            return false;
        }
    }
    return true;
}

在你的例子中:

String[] words = {"GAGGAG", "AGGAC"};
String sentence = "GAGGAGGTC";
if(checkContainsAll(sentence, words)) {
    System.out.println("The sentence " + sentence + " contains all words");
} else {
    System.out.println("The sentence " + sentence +" does not contain all words.");
}

DEMO


更新

要检查是否没有重叠,在我的示例中,最简单的解决方案是删除在给定句子中找到的单词,这样它们就不会出现在下一次检查中:

public boolean checkContainsAll(String sentence, String[] words) {
    for(String word : words) {
        if(!sentence.contains(word)) {
            return false;
        }
        sentence = sentence.replace(word, "");
    }
    return true;
}

DEMO

您必须像下面那样使用 alternation 运算符 |

Pattern.compile("GAGGAG.*AGGAC|AGGAC.*GAGGAG");

解释:

  • GAGGAG.*AGGAC 匹配 GAGGAG 加上 .* 中间出现的任何字符,并且必须有一个 AGGAC 子字符串。

  • | OR 运算符,以便它匹配任何顺序。

  • AGGAC 匹配 AGGAC ,.* 零个或多个字符加上 GAGGAG 字符串。

示例 1:

  Pattern pattern = Pattern.compile("GAGGAG.*AGGAC|AGGAC.*GAGGAG");
  if(pattern.matcher("GAGGAGGAC").find()){
         System.out.println("find");
  }else{
         System.out.println("Not find");
  }   // Output: Not find

示例 2:

Pattern pattern = Pattern.compile("GAGGAG.*AGGAC|AGGAC.*GAGGAG");
  if(pattern.matcher("GAGGAGAGGAC").find()){
         System.out.println("find");
  }else{
         System.out.println("Not find");
  }   
}    // Output: find

示例 3:

Pattern pattern = Pattern.compile("GAGGAG.*AGGAC|AGGAC.*GAGGAG");
  if(pattern.matcher("AGGACFOOGAGGAG").find()){
         System.out.println("find");
  }else{
         System.out.println("Not find");
  }  // Output: find