Java - 提取特殊字符和单词之间的文本

标签 java regex string

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

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örpackning Flaska (375 ml) Antal i butik 30 st Förpackning Flaska (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örpackning Flaska (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));

欢迎任何帮助和想法!

最佳答案

这可以一行完成!

看起来你想删除:

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

这是执行此操作的代码:

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

关于正则表达式的注释:

  • 我注意到您将单词边界编码为 "\b"。这是一个错误 - 你 cd 了一个文字退格键。相反,您将其编码为 "\\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

关于Java - 提取特殊字符和单词之间的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11088068/

相关文章:

regex - grok 过滤器(正则表达式)提取方括号内的字符串

regex - 如何在 Rust Nom 中匹配正则表达式但返回输入的剩余部分?

Python:查找句子的所有字谜

c# - 无法将参数值从 Byte[] 转换为 String

java - java中如何清除ClassCastException?

java - 在提交之前验证属性/YAML 文件中的值

java - 我是否可以在独立 ejb 模块中引用任何外部第 3 方 jar?

java - 使用 Spring Data REST 处理自定义异常 (i18n)

r - 每> n个字符替换子字符串(有条件地为空格插入换行符)

c++ - C++ 中的 StringStream/c_str() 损坏