2012-06-18 49 views
1

之間提取文本我有一個字符串,看起來像這樣爪哇 - 特殊字符和文字

String = "Förpackning Flaska (375 ml) Förslutning Skruvkapsyl Kr/lit (104,00) Pris 39,00 kr Antal i butik 30 st Hyllplats 04-11-01 Förpackning Flaska (750 ml) Förslutning Plastkork/syntetkork Kr/lit (100,00) Pris 75,00 kr Antal i butik 16 st Hyllplats 02-03-01"; 

我想提取一些這個字符串內文本。 我想要的最終結果是這樣的:

「FörpackningFlaska(375 ml)Antal i butik 30 stFörpackningFlaska(750 ml)Antal i butik 16 st」。

我可以使用下面的代碼:

name = name.replace(name.substring(name.indexOf(") ") + 2, name.indexOf("Antal")), ""); 
    name = name.replace(name.substring(name.indexOf("st ") + 2, name.lastIndexOf("")), ""); 

這會給我這樣的結果:

「FörpackningFlaska(375毫升)安塔爾我butik 30日」

它基本上做什麼我希望這樣做,但在模式的第一次出現之後停止。

我試圖使用正則表達式模式,但我無法得到它的工作。從觀察字符串,我得出結論,我需要一個正則表達式來匹配「)」和「Antal」之間的所有內容。我還需要刪除其他的混亂,但這很容易。我的問題是,我似乎無法讓我的正則表達式工作,而這可能是做這種事情的最佳方式。我知道我必須擺脫這個假設,才能在我的正則表達式中將它變成一個字面的字符,但我無法實現它。

這是正則表達式,我想出了,並試圖:

Pattern p = Pattern.compile("\b\\) (.+?)\bAntal"); 
    Matcher m = p.matcher(name); 
    m.find(); 
    System.out.println(m.group(1)); 

任何幫助和想法,歡迎!

+0

如果您希望代碼在一行中完成,請參閱我的回答 – Bohemian

回答

2

這可以在一行中完成!

看起來要刪除:

  • "st"後,接下來的兩個詞,並"Antal"

  • 一切之間")"
  • 下面是會做的代碼:

    input.replaceAll("((?<= st)([^ ]+){2}|(?<=\\)).*?(?= Antal))", ""); 
    

    關於正則表達式的注意事項:

    • 我注意到你編碼的字邊界爲"\b"。這是一個錯誤 - 你編寫了一個字面退格。相反,你的代碼作爲"\\b"
    • 我用正則表達式或表達(A|B)在一個正則表達式匹配兩個
    • 兩個正則表達式使用向後看,使置換文本中的空白,這是不是匹配零件清潔你想保留的輸入,然後把它放回去,這意味着我coudl將兩個正則表達式組合成一個或表達式
    • ?".*?"是重要的 - 它意味着一個非貪婪的匹配。沒有它,它會匹配第一支架和最後Antal,跳過任意Antal
    • 之間

    下面是一些測試代碼:

    public static void main(String[] args) { 
        String input = "Förpackning Flaska (375 ml) Förslutning Skruvkapsyl Kr/lit (104,00) Pris 39,00 kr Antal i butik 30 st Hyllplats 04-11-01 Förpackning Flaska (750 ml) Förslutning Plastkork/syntetkork Kr/lit (100,00) Pris 75,00 kr Antal i butik 16 st Hyllplats 02-03-01"; 
        String clean = input.replaceAll("((?<= st)([^ ]+){2}|(?<=\\)).*?(?= Antal))", ""); 
        System.out.println(clean); 
    } 
    

    輸出:

    Förpackning Flaska (375 ml) Antal i butik 30 st Förpackning Flaska (750 ml) Antal i butik 16 st 
    
    +0

    謝謝你的答案!看看用正則表達式可以完成什麼是很有趣的,這真的讓我想要了解更多!目前,我正在將我的Java技能聚焦於學習如何收集互聯網上的信息以用於我的程序中,例如網頁掃描和HTML解析。我想要從中提取數據的長串,並且正則表達式非常方便! 我保存了您的文章以備將來參考,所以再次感謝您! –

    2

    您可能正在爲java中的字符串尋找replaceAll方法。它具有以下簽名

    public String replaceAll(String regex, String replacement); 
    

    這樣,顧名思義,用替換文本替換正則表達式的所有實例。

    +1

    謝謝Saurabh!我不敢相信我錯過了那個! 我用'replaceAll'和這個正則表達式,並得到它的工作: '(「\\)(。*?)Antal」)' –

    0

    試試這個,不確定它是否適用於所有的字符串,您需要大致瞭解描述的最大長度。

    String s = "Förpackning Flaska (375 ml) Förslutning Skruvkapsyl Kr/lit (104,00) Pris 39,00 kr Antal i butik 30 st Hyllplats 04-11-01 Förpackning Flaska (750 ml) Förslutning Plastkork/syntetkork Kr/lit (100,00) Pris 75,00 kr Antal i butik 16 st Hyllplats 02-03-01"; 
    
    String out = ""; 
    Matcher mat = Pattern.compile("(Förpackning .{0,50}\\))|(Antal.{0,50}st)").matcher(s); 
    while(mat.find()) 
        out += mat.group()+" "; 
    System.out.println(out);