2010-05-17 33 views
5

我有以下字符串「3/4Ton」。我想把它分成 - >根據java中的模式分割字符串 - 大寫字母和數字

word [1] = 3/4,word [2] = Ton。

現在我的代碼看起來是這樣的: -

Pattern p = Pattern.compile("[A-Z]{1}[a-z]+"); 
Matcher m = p.matcher(line); 
while(m.find()){ 
    System.out.println("The word --> "+m.group()); 
    } 

它進行分割字符串需要基於任務的大寫字母,如: -

字符串= MachineryInput

字[1] =機械,字[2] =輸入

唯一的問題是它不保留,數字或縮寫或大寫字母序列並不意味着單獨的詞。有人能幫我解決我的正則表達式編碼問題。

在此先感謝...

+0

什麼啓動一個 「字」?它不能是任何大寫字母或數字,因爲「3/4」將是兩個單詞「3 /」和「4」。我想你需要在得到一個好答案之前更準確地定義你的規則。 – 2010-05-17 15:48:11

+0

一個數字或大寫字母。我感到困惑的是如何將我的需求合併到一個正則表達式中?我需要知道使用正則表達式的最佳方法是什麼,以便我的程序能夠根據數字或大寫字母來分割字符串作爲起點。 謝謝 – 2010-05-17 16:01:40

回答

4

你可以實際上只用正則表達式就可以做到這一點,使用前視圖和後面的 (見本頁特殊構造:http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html

/** 
* We'll use this pattern as divider to split the string into an array. 
* Usage: myString.split(DIVIDER_PATTERN); 
*/ 
private static final String DIVIDER_PATTERN = 

     "(?<=[^\\p{Lu}])(?=\\p{Lu})" 
       // either there is anything that is not an uppercase character 
       // followed by an uppercase character 

       + "|(?<=[\\p{Ll}])(?=\\d)" 
     // or there is a lowercase character followed by a digit 

     ; 

@Test 
public void testStringSplitting() { 
    assertEquals(2, "3/4Word".split(DIVIDER_PATTERN).length); 
    assertEquals(7, "ManyManyWordsInThisBigThing".split(DIVIDER_PATTERN).length); 
    assertEquals(7, "This123/4Mixed567ThingIsDifficult" 
         .split(DIVIDER_PATTERN).length); 
} 

所以你可以做的是這樣的:

for(String word: myString.split(DIVIDER_PATTERN)){ 
    System.out.println(word); 
} 

肖恩

+0

我在這條線上收到語法錯誤 「|(?<= [\\ p {Lower}])(?= \\ d)」 不確定原因。你能幫我嗎? – 2010-05-17 19:02:44

+0

你是對的,有一個+缺失(當我添加文檔時丟失了)。我會馬上添加它。 – 2010-05-17 19:22:14

+0

非常感謝您的幫助! – 2010-05-17 19:47:23

2

在這裏使用正則表達式會很好。我敢打賭,也有辦法做到這一點,雖然我不是一個擺擺擺臂的正規男人,所以我不能幫你。然而,有些東西是你無法避免的 - 有些東西需要最終遍歷你的字符串。你可以這樣做「對自己」像這樣:

String[] splitOnCapitals(String str) { 
    ArrayList<String> array = new ArrayList<String>(); 
    StringBuilder builder = new StringBuilder(); 
    int min = 0; 
    int max = 0; 
    for(int i = 0; i < str.length(); i++) { 
     if(Character.isUpperCase(str.charAt(i))) { 
      String line = builder.toString().trim(); 
      if (line.length() > 0) array.add(line); 
      builder = new StringBuilder(); 
     } 
     builder.append(str.charAt(i)); 
    } 
    array.add(builder.toString().trim()); // get the last little bit too 
    return array.toArray(new String[0]); 
} 

我用下面的測試驅動程序進行了測試:

public static void main(String[] args) { 
    String test = "3/4 Ton truCk"; 
    String[] arr = splitOnCapitals(test); 
    for(String s : arr) System.out.println(s); 

    test = "Start with Capital"; 
    arr = splitOnCapitals(test); 
    for(String s : arr) System.out.println(s); 
} 

,得到了以下的輸出:

3/4 
Ton tru 
Ck 
Start with 
Capital 
+0

謝謝你的幫助。這無疑給了我一種方向感,並向我展示了一種不同的方法。 – 2010-05-17 16:07:31