2012-03-17 107 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