在Java中拆分非分隔字符串的好方法是什么?

时间:2012-03-17 22:04:07

标签: java string split

我希望将EADGBE或DADF#AD形式的字符串拆分为单独的字符串,每个字符串包含一个字母或一个字母加一个#符号。有没有比用蛮力的方法迭代字符串更优雅的方式了?

String.split显然依赖于分隔符,然后将其丢弃,这对我来说根本没什么用处 - 我认为split("[a-gA-G]#?");会在那里工作几分钟,但不是,那不是'总而言之 - 我几乎想要与之相反......

4 个答案:

答案 0 :(得分:3)

在代码和性能方面,蛮力可能是您的最佳选择。

或者,您可以使用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 :(得分:1)

如果您预见到模式的变化,您可以使用:

  String s = "DADF#AD"; 
  Pattern p = Pattern.compile("([a-gA-G]#?)");
  Matcher matcher = p.matcher(s);
  while (matcher.find()) {
      System.out.println(matcher.group());
  }

答案 2 :(得分:1)

使用前瞻和后瞻作品: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]

答案 3 :(得分:0)

怎么样:添加分隔符,然后拆分:

此方法添加分隔符

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