为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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]");

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


查看完整描述

3 回答

?
慕前端131612

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


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。


查看完整回答
反对 回复 2019-12-25
?
素胚勾勒不出你

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


jTopas是一个AWESOME令牌生成器,它使手工编写解析器变得非常容易(我强烈建议在标准的Java扫描器/等库中使用jtopas)。如果您想了解实际的jtopas,这里有一些我使用jTopas编写的解析器,用于解析这种类型的文件


如果要解析XML文件,则应该使用xml解析器库。除非自己只是为了娱乐而做,否则不要自己做,那里有很多行之有效的选择


查看完整回答
反对 回复 2019-12-25
?
POPMUISE

一种通用,简单和有点原始的方法来查找标签,属性和值


    Pattern pattern = Pattern.compile("<(\\w+)( +.+)*>((.*))</\\1>");

    System.out.println(pattern.matcher("<asd> TEST</asd>").find());

    System.out.println(pattern.matcher("<asd TEST</asd>").find());

    System.out.println(pattern.matcher("<asd attr='3'> TEST</asd>").find());

    System.out.println(pattern.matcher("<asd> <x>TEST<x>asd>").find());

    System.out.println("-------");

    Matcher matcher = pattern.matcher("<as x> TEST</as>");

    if (matcher.find()) {

        for (int i = 0; i <= matcher.groupCount(); i++) {

            System.out.println(i + ":" + matcher.group(i));

        }

    }


查看完整回答
反对 回复 2019-12-25

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信