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

2022-08-31 11:35:54

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

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

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

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

不知道下一步该怎么办。有什么想法吗?谢谢。


答案 1

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

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


答案 2

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

jTopas是一个很棒的分词器,它可以很容易地手动编写解析器(我强烈建议jtopas而不是标准的java scanner/etc.库)。如果你想看到jtopas的实际应用,这里有一些我用jTopas编写的解析器来解析这种类型的文件

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