2016-06-10 7 views
0

моей программы взять большую строку от пользователя, как aaaabaaaaabaшаблона с использованием регулярных выражений заменить цифры

, то выход должен быть заменить ааа на 0 и АКА на 1 в данной схеме

строка не должна принимать последовательность одной в другую каждую последовательность

индивидуальное и как aaaabaaabaaaaba здесь ааа-аба-AAB-ааа-аба индивидуальны и

не должны перекрывать друг друга, подбирая пожалуйста, помогите мне получить эта программа

example: aaaabaaaaaba input ended output is 0101 
import java.util.Scanner; 

    import java.util.regex.Matcher; 
    import java.util.regex.Pattern; 



    public class Pattern1 { 
     Scanner sc =new Scanner(System.in); 


    public void m1() 

    { String s; 

     System.out.println("enter a string"); 
     s=sc.nextLine(); 
     assertTrue(s!=null); 

     Pattern p = Pattern.compile(s); 
     Matcher m =p.matcher(".(aaa"); 
     Matcher m1 =p.matcher("aba"); 

     while(m.find()) 
     { 

      s.replaceAll(s, "1"); 


     } 
    while(m1.find()) 
     { 
     s.replaceAll(s, "0"); 

     } 
     System.out.println(s); 

     } 




     private boolean assertTrue(boolean b) { 
      return b; 
     // TODO Auto-generated method stub 

    } 

     public static void main(String[] args) { 

      Pattern1 p = new Pattern1(); 
      p.m1(); 


     } 

    } 
+0

Каждая индивидуальная последовательность всегда 3 символа? – Arjan

+0

В коде есть много неправильных вещей. 's.replaceAll' не влияет на текущую строку, поскольку строки неизменяемы. Он создает новую строку с замененным значением, которое вы можете хранить где-нибудь. Кроме того, в чем смысл использовать 'replaceAll' вообще в этом случае, если вы хотите заменить только одну вещь (так как вы делаете эту замену в цикле)? Вы должны прочитать правильное учебное пособие по регулярному выражению и взглянуть на методы «appendReplacement» и «appendTail» из класса «Matcher». – Pshemo

+0

Также вы говорите, что «aaa» следует заменить на «0», а «aba» следует заменить на «1», но затем в тексте вы разделите строку, содержащую «aab». Это немного запутанно. – Arjan

ответ

1

С регулярными выражениями и найти вы можете найти для каждого последующего матча, а затем добавить 0 или 1 в зависимости от символов к выходу.

String test = "aaaabaaaaabaaaa"; 

Pattern compile = Pattern.compile("(?<triplet>(aaa)|(aba))"); 
Matcher matcher = compile.matcher(test); 

StringBuilder out = new StringBuilder(); 

int start = 0; 
while (matcher.find(start)) { 
    String triplet = matcher.group("triplet"); 

    switch (triplet) { 
     case "aaa": 
      out.append("0"); 
      break; 
     case "aba": 
      out.append("1"); 
      break; 
    } 

    start = matcher.end(); 
} 

System.out.println(out.toString()); 

Если у вас есть «aaaaaba» (один слишком много в первый триплет) в качестве входных данных, он будет игнорировать последнее «а» и выход «01». Таким образом, любые недопустимые символы между действительными триплетами будут игнорироваться.

Если вы хотите, чтобы пройти через строковые блоки 3 можно использовать для цикла и функции substring() так:

String test = "aaaabaaaaabaaaa"; 

StringBuilder out = new StringBuilder(); 

for (int i = 0; i < test.length() - 2; i += 3) { 
    String triplet = test.substring(i, i + 3); 

    switch (triplet) { 
     case "aaa": 
      out.append("0"); 
      break; 
     case "aba": 
      out.append("1"); 
      break; 
    } 
} 

System.out.println(out.toString()); 

В этом случае, если триплет является недействительным, это будет просто игнорируется, и ни один из «0» или «1» не будет добавлен к выходу. Если вы хотите что-то сделать в этом случае, просто добавьте предложение по умолчанию в оператор switch.

+0

В чем проблема с методом replaceAll объясните мне, пожалуйста, –

+0

Поскольку replaceAll заменяет все вхождения, он может иметь нежелательные эффекты. Например, если вы сначала замените все «aaa», то он превратит «abaaaa» в «ab0a», так как он всегда заменяет слева и справа одно совпадающее совпадение за раз. Используя другой метод (например, описанные мной), вы можете избежать этих проблем. Также в вашем коде вы должны установить s в возвращаемое значение replaceAll, поскольку оно не обновляет строку, но возвращает только новую строку (как указано в Pshemo). – Leon

0

Вот что я понял из вашего вопроса:

  • Строка пользователь будет некоторая последовательность лексем «ааа» и «аба»
  • Там не будет никаких других комбинаций «а» и ' б. Например, вы не получите «aaabaa» в качестве входной строки, как «BAA» недействительна ..
  • Для каждой последующей строки 3 символов, заменить «ааа» с 0 и «аба» с 1.

Я предполагаю, что это домашнее задание, предназначенное для того, чтобы научить вас об опасности катастрофического возврата и о том, как тщательно использовать квантификаторы.

Мое предложение было бы сделать это в двух частях:

  1. Определить и заменить каждый 3-буквенный сегмент с одного символа.
  2. Замените эти символы соответствующим значением. ('1' или '0')

Например, сначала создайте шаблон, например a([ab])a, чтобы захватить символ ('a' или 'b') между двумя символами a. Затем используйте метод replaceAll класса Matcher, чтобы заменить каждое совпадение на захваченный символ. Итак, для ввода aaaabaaaaaba' you get abab` в результате. Наконец, замените все 'a' на '0' и все 'b' на '1'.

В Java:

// Create the matcher to identify triplets in the form "aaa" or "aba" 
Matcher tripletMatcher = Pattern.compile("a([ab])a").matcher(inputString); 

// Replace each triplet with the middle letter, then replace 'a' and 'b' properly. 
String result = tripletMatcher.replaceAll("$1").replace('a', '0').replace('b', '1'); 

Там же лучшие способы сделать это, конечно, но это должно работать. Я оставил код намеренно плотным и трудно читаемым. Итак, если это домашнее задание, убедитесь, что вы его полностью понимаете, а затем переписываете сами.

Также имейте в виду, что это не будет работать, если входная строка не является последовательностью «aaa» и «aba». Любая другая комбинация, такая как «baa» или «abb», вызовет ошибки. Например, ababaa, aababa и aaabab приведут к неожиданным и потенциально неправильным результатам.

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