我是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'匹配...
任何帮助都将受到高度赞赏..
答案 0 :(得分:1)
为什么要使用正则表达式?我不熟悉Java库,但我想有一个库可以让你使用XPath进行XQueries。那将是更简单的方法。
答案 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已经回答了你的问题,但也许我的写作中有一些价值,所以无论如何我都会发帖。