Какой хороший способ разделить строку без разделителей в Java? - PullRequest
5 голосов
/ 18 марта 2012

Я хочу разбить строки в форме EADGBE или DADF # AD на отдельные строки, каждая из которых содержит одну букву или одну букву плюс знак #.Есть ли более изящный способ, чем итерация по строке с использованием метода грубой силы?

String.split, очевидно, полагается на разделители, которые затем отбрасываются, что мне совсем не нужно - дляЧерез пару минут я подумал, что split("[a-gA-G]#?"); собирается работать, но нет, это совсем не помогает - я почти хочу противоположность этому ...

Ответы [ 4 ]

3 голосов
/ 18 марта 2012

Грубая сила, вероятно, будет вашим лучшим вариантом, как с точки зрения кода, так и производительности.

В качестве альтернативы вы можете использовать Matcher

Pattern p = Pattern.compile("[a-gA-G]#?");
Matcher m = p.march(inputString);
List<String> matches = new ArrayList<String>();
while(m.find())
   matches.add(m.group());
1 голос
/ 18 марта 2012

Использование работ вида вперед и назад: String regex = "(?<=.)(?=\\w#?)";

Например,

import java.util.Arrays;

public class Foo {
   public static void main(String[] args) {
      String[] tests = {"EADGBE", "DADF#AD"};
      String regex = "(?<=.)(?=\\w#?)";
      for (String test : tests) {
         System.out.println(Arrays.toString(test.split(regex)));
      }
   }
}

возвращает:

[E, A, D, G, B, E]
[D, A, D, F #, A, D]

1 голос
/ 18 марта 2012

Если вы видите изменения в шаблоне, вы можете использовать:

  String s = "DADF#AD"; 
  Pattern p = Pattern.compile("([a-gA-G]#?)");
  Matcher matcher = p.matcher(s);
  while (matcher.find()) {
      System.out.println(matcher.group());
  }
0 голосов
/ 18 марта 2012

Как насчет этого: добавить разделители, а затем разделить:

Этот метод добавляет разделители

private static String delimit(String in) {
  StringBuilder sb = new StringBuilder();
  for (int i = 0; i < in.length()-1; i++) {
    sb.append(in.charAt(i));
    if (in.charAt(i+1) != '#')
      sb.append(';');
  }
  return sb.toString();
}

Чтобы использовать это:

String[] notes = delimit("DADF#AD").split(";");
...