2012-03-17 92 views
5

我想将字符串以EADGBE或DADF#AD的形式拆分为单独的字符串,每个字符串都包含一个字母或一个字母加上#号。有没有更好的方法比用蛮力的方式迭代字符串更好?在Java中分割非分隔字符串的好方法是什么?

String.split显然依赖于分隔符,然后将其丢弃,这对我来说根本没有多大用处 - 几分钟后,我认为split("[a-gA-G]#?");即将起作用,但是不会,这对于所有 - 我几乎想要相反...

+0

你可以举一个你想分割的字符串的例子吗? – chandsie 2012-03-17 22:09:28

+0

恐怕你不得不采取蛮力的方法 – mac 2012-03-17 22:11:07

+0

这很简单。去蛮力。不要增加正则表达式的复杂性和概览。 – 2012-03-17 22:38:22

回答

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()); 
+0

啊,非常好 - 我的搜索引擎没有发现关于Matchers的任何事情!感谢那。 :) – Oolong 2012-03-17 23:42:21

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()); 
    } 
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]

+0

'String regex =“(?=(?!^)\\ w#?)”;',你去了。 – 2012-03-17 22:29:29

+0

@refp:这看起来也可以工作 - 防止捕捉行开始。华而不实,谢谢! – 2012-03-17 22:31:15

+0

啊......我不知道这是一个选项!也许不是最友好的技术 - 或者我的意思是说新手友好 - 但是要知道这是你可以用Java中的正则表达式做的事。谢谢! – Oolong 2012-03-17 23:48:59

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

为什么不使用for循环来生成一个令牌列表,而不是建立一个不必要的中间字符串? – Dunes 2012-03-17 23:22:15

+0

@Dunes我已经发布了几十个这样的标准解决方案 - 只是想做些不同的事情;) – 2012-03-17 23:25:25

+0

heh!我想这会起作用,是的。我确实想知道插入分隔符,但我认为必须有一种更简单的方式......正如其他用户指出的那样!但是,无论如何,感谢替代品是健康的... – Oolong 2012-03-17 23:45:39