2014-06-17 28 views
0

一個字符串我有一個字符串記號化在Java中

a-b-c 

那我要來標記的字符字符串「 - 」,其結果必然是

[a, b, c] 

但後來我有一個字符串

a---c 

結果應該是

[a, -, c] 

Java中已經有一個可以做到這一點的標記器嗎?

+0

是的!有一個字符串標記符http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html – NewUser

+0

StringTokenizer是一個遺留類(現在用於幾個版本的Java),不應該再使用。 使用正則表達式或字符串的拆分方法。 – Stultuske

+2

另一個可能的結果是'[a--,c]'。它是否總是由連字符分隔的一個字符值?我們需要一些規則來避免模棱兩可的結果。 –

回答

1

這是僅使用正則表達式來給你所需要的結果的解決方案爲您的測試數據:

​​

Regular expression visualization

Debuggex Demo

字邊界(\b)的可能性常常被低估,但可以大大簡化許多正則表達式。

使用提供的正則表達式,您現在可以使用Javas split方法。於是小的TestClass可能看起來像:

public class SimpleRegExp { 
    public static void main(String[] args) { 
     String regexp = "\\b-|-\\b"; 
     System.out.println(Arrays.toString("a-b-c".split(regexp))); 
     System.out.println(Arrays.toString("a---c".split(regexp))); 
    } 
} 

,並打印這樣的結果:

[a, b, c] 
[a, -, c] 
0

這(第一次嘗試)似乎是按要求處理您的樣品。

String rex = "(?<=-)-(?=\\w)|(?<=\\w)-(?=-)|(?<=\\w)-(?=\\w)"; 
String[] t1 = s1.split(rex); 

\ w是與' - '相對應的正確假設嗎?否則,這應該改變。

此外,我認爲它可以有所濃縮。

+0

「a ---- c」被分割成a, - ,b,這可能是也可能不是你想要的。 – laune

0

我打算假定你的分隔符總是一個連字符,而---將分成[-,-]。並且該將無效或拆分爲[-,-]。在這種情況下,下面就爲你工作:

private static List<String> tokenize(String input, char delimeter) { 
    List<String> result = new ArrayList<String>(); 
    StringBuilder builder = new StringBuilder(); 

    for (char c : input.toCharArray()) { 
     if (builder.length() == 0) { 
      builder.append(c); 
     } else if (c == delimeter) { 
      result.add(builder.toString()); 
      builder.setLength(0); 
     } else { 
      builder.append(c); 
     } 
    } 

    if (builder.length() > 0) { 
     result.add(builder.toString()); 
    } 

    return result; 
} 

測試代碼:

public static void main(String[] args) throws Exception { 
    String s1 = "a-b-c"; 
    String s2 = "a---c"; 

    System.out.println(Arrays.toString(tokenize(s1, '-').toArray())); 
    System.out.println(Arrays.toString(tokenize(s2, '-').toArray())); 
} 

打印:

 
[a, b, c] 
[a, -, c]