【问题标题】:How to extract string between double quotes in java? [duplicate]如何在java中提取双引号之间的字符串? [复制]
【发布时间】:2020-04-01 05:14:39
【问题描述】:

我正在阅读来自期刊或论文来源的回复,并且我将 html 回复作为字符串,例如:

根据某些人的说法,梦表达了“个性的深刻方面”(Foulkes 184),尽管“其他人不同意”但事实是这样。

我的目标只是从给定字符串中提取所有引号并将它们中的每一个保存到一个列表中。并在原始字符串中添加空格代替引号。

【问题讨论】:

  • 使用正则表达式模式,例如"\".*?\"",然后使用Pattern#matches,后跟Matcher#find。快乐编程。
  • 那么你想把所有引号都放到 ArrayList 中,然后用空格替换字符串的所有引号吗?如果我错了,请纠正我。
  • 请注意,上面使用find 的技巧还可以让您获得每个匹配项的开始和结束索引,因此更改字符串的第二步应该很容易。我真的不想给出完整的答案,这毕竟不是代码服务。

标签: java string


【解决方案1】:

此代码会将所有引号替换为一个空格,并在列表中保存不带括号的引号:

public static void main(String[] args) {    
        String str = "According to some, dreams express \"profound aspects of personality\" (Foulkes 184), though \"others disagree\" but truth is.";
        Pattern pattern = Pattern.compile("\".*?\"");
        Matcher matcher = pattern.matcher(str);

        List<String> quotes = new ArrayList<>();
        StringBuffer buffer = new StringBuffer();

        while (matcher.find()) {
            String quote = matcher.group();
            int length = quote.length();
            quotes.add(quote.substring(1, length - 1));
            matcher.appendReplacement(buffer, " ");
        }
        matcher.appendTail(buffer);

        System.out.println(buffer.toString());
        System.out.println(quotes);
    }

此解决方案需要一些额外的修复,具体取决于文本中是否存在空括号,但它适用于您的情况。

输出:

根据某些人的说法,梦想表达(Foulkes 184),但事实是。

[个性深刻的方面,其他人不同意]

【讨论】:

  • @Maarten-reinstateMonica 是的,StringBuilder 效率更高,但 appendReplacement 方法仅适用于 StringBuffer
  • 对,有趣!我可以理解他们删除了它,这是一种有点令人惊讶的功能,它似乎需要额外的状态。但我一直认为StringBuilderStringBuffer 的更高效、非线程安全的版本……我从没想过他们遗漏了功能。我将删除上面的 cmets 和此评论,因为它们开始偏离主题...
猜你喜欢
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多