簡體   English   中英

Java - 在特殊字符和單詞之間提取文本

[英]Java - Extract text between special character and word

我有一個看起來像這樣的字符串

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 30stFö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 ml)Antal i butik 30 st”

它基本上做了我想要它做的事情,但它在第一次出現模式后停止。

我試圖使用正則表達式模式,但我不能讓它工作。 從觀察字符串開始,我得出結論,我需要一個匹配“)”和“Antal”之間所有內容的正則表達式模式。 我還需要刪除其他雜亂,但這很容易。 我的問題是,我似乎無法讓我的正則表達式工作,這可能是做這樣的事情的最佳方式。 我知道我必須逃避這個問題才能使它成為我的正則表達式中的字面字符,但我無法讓它工作。

這是我提出並嘗試的正則表達式:

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

歡迎任何幫助和想法!

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

public String replaceAll(String regex, String replacement);

顧名思義,這取代了替換文本所出現的正則表達式的所有實例。

這可以在一行中完成!

看起來你想刪除:

  • "st"之后的下兩個單詞,和
  • ")""Antal"之間的一切

這是將執行此操作的代碼:

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

關於正則表達式的注釋:

  • 我注意到你將單詞邊界編碼為"\\b" 這是一個錯誤 - 你提到了一個字面退格。 相反,您將其編碼為"\\\\b"
  • 我使用正則表達式OR表達式(A|B)來匹配一個正則表達式
  • 兩個正則表達式都使用后視來使替換文本變為空白,這比匹配您想要保留的部分輸入更清晰,然后將其放回去,這意味着我將兩個正則表達式組合成一個OR表達式
  • ? ".*?" 很重要 - 這意味着非貪婪的比賽。 沒有它,它將匹配第一個支架和最后一個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

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

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM