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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

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

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

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

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

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

提问于
用户回答回答于

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

final Pattern pattern = Pattern.compile("<tag>(.+?)</tag>");
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>");

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来查找我感兴趣的元素。有关更多信息,请参阅Java XPath API

用户回答回答于

说实话,正则表达式不是这种类型解析的最佳方法。你发布的正则表达式可能对于简单的情况非常有用,但是如果事情变得更加复杂,你将会遇到大问题(同样的原因你不能可靠地用正则表达式解析HTML)。我知道你可能不想听到这个,我知道我没有问过同样类型的问题,但是当我停止尝试对所有东西使用正则表达式后,字符串解析变得更加可靠。

jTopas是一个令人敬佩的标记器,它使得用手写解析器变得非常容易(我强烈建议jtopas比标准java扫描器/ etc ..库更好)。如果你想在行动中看到jtopas,这里有一些解析器使用我向jTopas解析写这种类型的文件

如果您正在解析XML文件,则应该使用xml解析器库。不要自己动手,除非你只是为了好玩而做,有充足的证明选项

扫码关注云+社区