1

我是正则表达式的新手。我为以下场景编写正则表达式感到震惊。有人可以帮我解决这个问题吗?

如果我有如下字符串:

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

<Tag2> 和 </Tag2> 标签之间匹配“测试”的正则表达式是什么?

输出应与 Tag4 和 Tag5 中的“测试”匹配...

任何帮助将不胜感激..

4

4 回答 4

1

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

这是一个显示示例的网站

这是关于 Java 中 XPath 的一个 SO 问题

于 2012-06-20T14:24:27.493 回答
1

XPath 确实更适合于此。这看起来像重复的帖子。 原来的

Perl 在 CPAN 上有几个很好的 xpath 解析器。但是,如果您绝对必须使用它,这里有一个关于多行正则表达式解析的好页面。

于 2012-06-20T14:29:03.933 回答
0

之前所说的都是完全正确的-但是,如果您仍然想练习一些正则表达式,则可以选择:在一场比赛中进行是不可能的,因为其中一个内部组将始终被丢弃(请参阅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 :)

于 2012-06-20T15:22:23.690 回答
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

后跟 ' 或 " 字符

后跟任何不是>的字符

其次是 >

添加其中一些额外位的目的只是为了强调您可能需要/想要考虑考虑不同的编码样式等。注意:我通过将模式设置为不区分大小写来简化操作,但您可以省略并更改您的表达式以检查适当的大小写(例如,如果您的属性值区分大小写,您可以将“标签”文字更改为 [tT][aA][gG] 以允许匹配标签不区分大小写。

我显然打字太慢了,因为 jvataman 已经回答了你的问题,但也许我的文章有一些价值,所以我还是会发布。

于 2012-06-20T15:25:19.057 回答