2015-01-16 1 views
0

Я хочу, чтобы одна длинная строка содержала несколько строк.Шаблон Java содержит все строки в массиве

Я пытаюсь использовать команду ниже.

  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»

Как я могу дать вариант от «или» до «А»

И есть еще один вариант.

  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"); 
      }   

Это также должно показать «Не найти». Потому что не разрешается перекрытие. «GAGGAG» и «AGGAC» перекрывается «AG» часть от «GAGGAGGAAC»

+1

Вы должны использовать регулярные выражения? Использование 'contains' намного проще. – August

+1

Это может помочь вам http://stackoverflow.com/questions/469913/regular-expressions-is-there-an-and-operator – Upio

ответ

1

Вам не нужно регулярное выражение для этой цели ,

Использование 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


UPDATE

Чтобы проверить, что там я s не перекрывается, самое простое решение в моем примере было бы удалить слова, если они находятся в данном предложении, так что они не будут присутствовать на следующие проверки:

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

DEMO

+0

I Мне очень жаль, что это здорово, но я забыл упомянуть, так как попрошайничество, которое не позволяет перекрывать часть. –

+0

Я имею в виду предложение «GAGGAGGTC» не разрешать, потому что есть перекрывающаяся часть. но «GAGGAGNNNAGGAC» разрешить, потому что он не перекрывается –

+0

@ clear.choi Проверьте мое обновление – BackSlash

0

Измените регулярное выражение это для «и» оператор

(?=GAGGAG)(?=AGGAC) 
+0

Это [не работает] (http://ideone.com/FfmIeI) – BackSlash

2

Вы должны необходимо использовать оператор 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 

 Смежные вопросы

  • Нет связанных вопросов^_^