正则表达式:匹配字符串中两个标记之间的字符串

时间:2012-06-20 14:21:08

标签: java regex

我是Regexp的新手。我在为下面的场景写regexp时很震惊。有人可以帮我解决这个问题吗?

如果我有如下字符串:

<Tag1 attr="test"/>
<Tag2>
    <Tag4 attr="test"/>
    <Tag5 attr="test"/>
</Tag2>
<Tag3 attr="test"/>

正则表达式匹配&lt; Tag2&gt;之间的'test'。和&lt; / Tag2&gt;标签

输出应与Tag4和Tag5中的'test'匹配...

任何帮助都将受到高度赞赏..

4 个答案:

答案 0 :(得分:1)

为什么要使用正则表达式?我不熟悉Java库,但我想有一个库可以让你使用XPath进行XQueries。那将是更简单的方法。

Here is a website that shows examples

Here is a SO question on XPath in Java

答案 1 :(得分:1)

XPath真的更适合这个。这看起来像重复的帖子。 Original

Perl在CPAN上有几个很好的xpath解析器。但是,如果您绝对必须使用它,那么这是multiline regex解析的好页面。

答案 2 :(得分:0)

以前所说的都是完全正确的 - 但是如果你仍然想练习一些正则表达式,那么另外一个: 由于其中一个内部组将始终被丢弃(see this),因此无法在一次匹配中执行此操作,因此您必须首先提取内部通道。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTagParse {

static String html = "<Tag1 attr=\"test\"/><Tag2>    <Tag4 attr=\"test_one\"/>    <Tag5 attr=\"test_two\"/></Tag2><Tag3 attr=\"test\"/>";

public static void main(String[] args) {
    Matcher mat1 = Pattern.compile("Tag2>(.*)</Tag2").matcher(html);
    mat1.find();

    Matcher mat2 = Pattern.compile("<[^<>]*attr=\"([^\"]+)\"[^<>]>").matcher(mat1.group(1));
    while(mat2.find()){
        System.out.println(mat2.group(1));
    }
}

}

无论如何,使用XPath你会好得多:)

答案 3 :(得分:0)

我没有使用java,但我希望能为正则表达式提供一些指导。如果您知道要查找的具体属性和值是什么,则可以使用以下内容:

Pattern pattern = Pattern.compile("<tag[45].*attr\s*=\s*[\"']test['\"][^>]*>", Pattern.CASE_INSENSITIVE);

Matcher matcher = pattern.matcher("<Tag1 attr='test'/><Tag2><Tag4 attr='test'/><Tag5 attr='test'/></Tag2><Tag3 attr='test'/>");

matcher.matches();

正则表达式由以下组件组成:

匹配文字字符串:

后跟4或5([45]指定)

后跟文字字符串前面的任意数量的字符:attr

后跟任意数量的空格

后跟文字字符:=

后跟任意数量的空格

后跟'或'字符

后跟字符串文字:test

后跟'或'字符

后跟任何不是&gt;

的字符

后跟&gt;

添加其中一些额外位的重点只是突出显示您可能需要/想要考虑不同的编码样式等等。注意:我通过将模式设置为不区分大小写来轻松实现,但是您可以省略并更改表达式以检查相应的大小写(例如,如果您的属性值区分大小写,则可以将'​​tag'文字更改为[tT] [aA] [gG]以允许将标记匹配为不区分大小写。

我显然打字速度太慢,因为jvataman已经回答了你的问题,但也许我的写作中有一些价值,所以无论如何我都会发帖。