我希望将EADGBE或DADF#AD形式的字符串拆分为单独的字符串,每个字符串包含一个字母或一个字母加一个#符号。有没有比用蛮力的方法迭代字符串更优雅的方式了?
String.split显然依赖于分隔符,然后将其丢弃,这对我来说根本没什么用处 - 我认为split("[a-gA-G]#?");
会在那里工作几分钟,但不是,那不是'总而言之 - 我几乎想要与之相反......
答案 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(";");