Java正则表达式提取标签之间的文本

新手上路,请多包涵

我有一个包含一些自定义标签的文件,我想编写一个正则表达式来提取标签之间的字符串。例如,如果我的标签是:

 [customtag]String I want to extract[/customtag]

我将如何编写正则表达式来仅提取标签之间的字符串。这段代码似乎是朝着正确方向迈出的一步:

 Pattern p = Pattern.compile("[customtag](.+?)[/customtag]");
Matcher m = p.matcher("[customtag]String I want to extract[/customtag]");

不知道下一步该怎么做。有任何想法吗?谢谢。

原文由 b10hazard 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

你在正确的轨道上。现在您只需要提取所需的组,如下所示:

 final Pattern pattern = Pattern.compile("<tag>(.+?)</tag>", Pattern.DOTALL);
final Matcher matcher = pattern.matcher("<tag>String I want to extract</tag>");
matcher.find();
System.out.println(matcher.group(1)); // Prints String I want to extract

如果你想提取多个命中,试试这个:

 public static void main(String[] args) {
    final String str = "<tag>apple</tag><b>hello</b><tag>orange</tag><tag>pear</tag>";
    System.out.println(Arrays.toString(getTagValues(str).toArray())); // Prints [apple, orange, pear]
}

private static final Pattern TAG_REGEX = Pattern.compile("<tag>(.+?)</tag>", Pattern.DOTALL);

private static List<String> getTagValues(final String str) {
    final List<String> tagValues = new ArrayList<String>();
    final Matcher matcher = TAG_REGEX.matcher(str);
    while (matcher.find()) {
        tagValues.add(matcher.group(1));
    }
    return tagValues;
}

但是,我同意正则表达式不是这里的最佳答案。我会使用 XPath 来查找我感兴趣的元素。有关详细信息,请参阅 The Java XPath API

原文由 hoipolloi 发布,翻译遵循 CC BY-SA 4.0 许可协议

老实说,正则表达式并不是这种解析的最佳选择。您发布的正则表达式可能适用于简单的情况,但如果事情变得更复杂,您将遇到巨大的问题(这与您无法使用正则表达式可靠地解析 HTML 的原因相同)。我知道你可能不想听这个,我知道当我问同样类型的问题时我不想听,但是在我停止尝试对所有内容使用正则表达式后,字符串解析对我来说变得更加可靠。

jTopas 是一个很棒的分词器,它使得手工编写解析器变得非常容易(我强烈建议使用 jtopas 而不是标准的 java 扫描器/等.. 库)。如果您想查看 jtopas 的实际效果, 这里 有一些我使用 jTopas 编写的解析器来解析 此类 文件

如果要解析 XML 文件,则应该使用 xml 解析器库。不要自己做,除非你只是为了好玩,那里有很多经过验证的选择

原文由 jdc0589 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题