首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java regex用于提取标记之间的文本

Java regex用于提取标记之间的文本
EN

Stack Overflow用户
提问于 2011-07-03 10:01:55
回答 6查看 185.8K关注 0票数 87

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

代码语言:javascript
复制
[customtag]String I want to extract[/customtag]

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

代码语言:javascript
复制
Pattern p = Pattern.compile("[customtag](.+?)[/customtag]");
Matcher m = p.matcher("[customtag]String I want to extract[/customtag]");

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-07-03 10:06:04

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

代码语言:javascript
复制
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

如果您想提取多个匹配项,请尝试以下操作:

代码语言:javascript
复制
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

票数 194
EN

Stack Overflow用户

发布于 2015-09-03 08:49:54

用于查找标签、属性和值的通用、更简单和有点原始的方法

代码语言:javascript
复制
    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));
        }
    }
票数 7
EN

Stack Overflow用户

发布于 2015-10-24 04:12:04

试试这个:

代码语言:javascript
复制
Pattern p = Pattern.compile(?<=\\<(any_tag)\\>)(\\s*.*\\s*)(?=\\<\\/(any_tag)\\>);
Matcher m = p.matcher(anyString);

例如:

代码语言:javascript
复制
String str = "<TR> <TD>1Q Ene</TD> <TD>3.08%</TD> </TR>";
Pattern p = Pattern.compile("(?<=\\<TD\\>)(\\s*.*\\s*)(?=\\<\\/TD\\>)");
Matcher m = p.matcher(str);
while(m.find()){
   Log.e("Regex"," Regex result: " + m.group())       
}

输出:

10烯

3.08%

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6560672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档