2012-12-19 87 views
2

我的信息等這樣的一個例子的動態輸入:正則表達式到一個字符串分割成3份

的Xbox 360(黑色)精英控制檯120GB(梅森城伊利諾伊)$ 200

$ 200 2013北徑露營者(RT 202.曼徹斯特,緬因州)224美元/月。

雪地摩托自行車拖車(溫斯羅普/奧古斯塔)$ 40每月

「偉大的聖誕禮物」 的Xbox 360吉他英雄(Springfied)

我想使用正則表達式在Android中的字符串分割成三個部分:

  1. XXX()
  2. 文本中(XXX)
  3. 文本之前的文本after()XXX

有時候不會有價格,在()後面的文字位置。

我試圖

Pattern p = Pattern.compile("\(([^]*)\)"); 
Matcher m = p.matcher(title); 

但我不能匹配器在Android中運行。當我用matcher.group(1)查看時,它總是返回空白。我把它設置當前尋找任何(或$和爆炸太給我單獨的字符串。但是,這是不準確的和低效的。

任何幫助apperciated!

+1

我假設你要包括'(梅森城伊利諾伊州)',但不包括'(黑色)'? –

+0

是的,這是我遇到的問題之一 – Nick

+0

我懷疑你只想解析最後一個'()'。 –

回答

4

我懷疑你可以用正則表達式來做到這一點,但它可能會更簡單。

String input[] = { 
      "Xbox 360 (black) Elite Console 120GB (Mason City Illinois) $200", 
      "$200 2013 North Trail Camper (RT 202. Manchester, Maine) $224/mo.", 
      "Snowmobile Bike trailers (Winthrop/Augusta) $40 Monthly", 
      "\"Great Xmas Gift\" XBox 360 Guitar Hero (Springfied)" 
    }; 
    for (String s : input) { 
     int lastClose = s.lastIndexOf(')'); 
     int lastOpen = s.lastIndexOf('(', lastClose); 
     System.out.println(s.substring(0, lastOpen).trim() + 
       "~" + s.substring(lastOpen + 1, lastClose).trim() + 
       "~" + s.substring(lastClose + 1).trim()); 
    } 

打印

Xbox 360 (black) Elite Console 120GB~Mason City Illinois~$200 
$200 2013 North Trail Camper~RT 202. Manchester, Maine~$224/mo. 
Snowmobile Bike trailers~Winthrop/Augusta~$40 Monthly 
"Great Xmas Gift" XBox 360 Guitar Hero~Springfied~ 
+1

Ack,我剛剛更新了我的答案,做同樣的事情!好主意 ;-) – maerics

1

不知道你是否需要使用正則表達式,但如果你不爲什麼不使用String.split。然後,您可以使用"\\(|\\)"將括號中的字符串拆分,然後從創建的字符串數組中獲取各個部分。

+0

這是我的原始方法,但正如您在第一個項目中看到的那樣,它有兩套parens和字符串分割不能很好地處理。 – Nick

1

[編輯]我不會對這個問題使用正則表達式;相反,我會簡單地使用String#lastIndexOf(...)方法來找到最後()字符的邊界,並返回子從這些值:

public static String[] splitParens(String s) { 
    if (s == null) return null; 
    int indexOfLastOpenParen = s.lastIndexOf('('); 
    int indexOfLastCloseParen = s.lastIndexOf(')'); 
    return new String[] { 
    s.substring(0, indexOfLastOpenParen), 
    s.substring(indexOfLastOpenParen + 1, indexOfLastCloseParen), 
    s.substring(indexOfLastCloseParen + 1) 
    }; 
} 
public static void main(String args[]) throws Exception { 
    String input[] = { 
    "Xbox 360 (black) Elite Console 120GB (Mason City Illinois) $200", 
    "$200 2013 North Trail Camper (RT 202. Manchester, Maine) $224/mo.", 
    "Snowmobile Bike trailers (Winthrop/Augusta) $40 Monthly", 
    "\"Great Xmas Gift\" XBox 360 Guitar Hero (Springfied)" 
    }; 
    Pattern p = Pattern.compile("\\(([^\\)]+)\\)"); 
    for (String s : input) { 
    System.out.println(Arrays.asList(splitParens(s))); 
    } 
    // => 
    // [Xbox 360 (black) Elite Console 120GB , Mason City Illinois , $200] 
    // [$200 2013 North Trail Camper , RT 202. Manchester, Maine, $224/mo.] 
    // [Snowmobile Bike trailers , Winthrop/Augusta, $40 Monthly] 
    // ["Great Xmas Gift" XBox 360 Guitar Hero , Springfied, ] 
} 

當然,需要更多的錯誤檢查(例如,如果沒有()?)。

+0

它需要拆分最後一個(),而不是第一個。 –

+0

是的,第一行分裂,所以黑色將是位置和精英控制檯... $ 200將是我試圖避免的價格 – Nick

+0

@Nick:明白了;我只是更新了我的答案,但看起來PeterLawrey打敗了我! – maerics

相關問題