我有一个看起来像这样的字符串

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毫升)Antal i butik 30 stFörpackningFlaska(750毫升)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毫升)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));


欢迎任何帮助和想法!

最佳答案

可以一行完成!

您似乎要删除:


单词"st"之后的后两个单词,以及
")""Antal"之间的所有内容


这是将执行此操作的代码:

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


有关正则表达式的注意事项:


我注意到您将单词边界编码为"\b"。这是一个错误-您给字面量退格了。相反,您将其编码为"\\b"
我用了一个正则表达式或表达式(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

08-03 13:51