繁体   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