我是正则表达式的新手。我为以下场景编写正则表达式感到震惊。有人可以帮我解决这个问题吗?
如果我有如下字符串:
<Tag1 attr="test"/>
<Tag2>
<Tag4 attr="test"/>
<Tag5 attr="test"/>
</Tag2>
<Tag3 attr="test"/>
<Tag2> 和 </Tag2> 标签之间匹配“测试”的正则表达式是什么?
输出应与 Tag4 和 Tag5 中的“测试”匹配...
任何帮助将不胜感激..
你为什么要为此使用正则表达式?我不熟悉 Java 库,但我想有一个库可以让您使用 XPath 进行 XQuery。那将是更简单的方法。
之前所说的都是完全正确的-但是,如果您仍然想练习一些正则表达式,则可以选择:在一场比赛中进行是不可能的,因为其中一个内部组将始终被丢弃(请参阅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 :)
我没有在实践中使用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 已经回答了你的问题,但也许我的文章有一些价值,所以我还是会发布。