Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式:在字符串中的两个标记之间匹配字符串_Java_Regex - Fatal编程技术网

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

Java 正则表达式:在字符串中的两个标记之间匹配字符串,java,regex,Java,Regex,我不熟悉Regexp。我为下面的场景编写regexp感到震惊。有人能帮我解决这个问题吗 如果我有如下字符串: <Tag1 attr="test"/> <Tag2> <Tag4 attr="test"/> <Tag5 attr="test"/> </Tag2> <Tag3 attr="test"/> Pattern pattern = Pattern.compile("<tag[45].*attr\s*

我不熟悉Regexp。我为下面的场景编写regexp感到震惊。有人能帮我解决这个问题吗

如果我有如下字符串:

<Tag1 attr="test"/>
<Tag2>
    <Tag4 attr="test"/>
    <Tag5 attr="test"/>
</Tag2>
<Tag3 attr="test"/>
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();

和标记之间匹配“test”的正则表达式是什么

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


非常感谢您的帮助。

您为什么要使用正则表达式来完成此操作?我不熟悉Java库,但我可以想象有一个库允许您使用XPath执行XQuery。这将是更简单的方法


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


Perl在CPAN上有两个很好的xpath解析器。但是,如果您必须使用解析,这里有一个很好的解析页面。

前面所说的都是完全正确的-但是如果您仍然想练习一些正则表达式,这里有一个替代方法: 在一个匹配中这样做是不可能的,因为其中一个内部组将始终被丢弃,所以您必须首先提取内部通道

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));
    }
}

}
import java.util.regex.Matcher;
导入java.util.regex.Pattern;
公共类RegexTagParse{
静态字符串html=“”;
公共静态void main(字符串[]args){

Matcher mat1=Pattern.compile(“Tag2>(.*)我不习惯使用java,但我希望我可以为正则表达式提供一些指导。如果您知道您要查找的特定属性和值,可以使用以下内容:

<Tag1 attr="test"/>
<Tag2>
    <Tag4 attr="test"/>
    <Tag5 attr="test"/>
</Tag2>
<Tag3 attr="test"/>
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();
Pattern=Pattern.compile(“]*>”,Pattern.CASE不区分大小写);
Matcher Matcher=pattern.Matcher(“”);
matcher.matches();
正则表达式由以下组件组成:

匹配文本字符串: 后跟4或5(即[45]名称)

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

后跟任意数量的空格

后跟文字字符:=

后跟任意数量的空格

后跟“或”字符

后跟字符串文字:test

后跟“或”字符

后跟任何非>

后跟>

添加一些额外位的要点仅仅是强调你可能需要/考虑考虑不同的编码风格等。注意:我通过将模式设置为不区分大小写而采取了简单的方法,但是您可以省略并更改表达式以检查适当的情况。(例如,如果属性值区分大小写,则可以将“tag”文本更改为[tT][aA][gG],以便允许匹配的标记不区分大小写


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

我相信这是一个标准答案:你不能使用正则表达式来解析HTML/XML。试着使用HTML或XML解析器。+1表示XPath,但请注意他有一个字符串,并且它不是有效的XML,因为它没有根。把它扔进假根中使用可能会更容易xpath@user12345613这正是我要回答的问题。为什么要将任何内容过度复杂化呢?向任何XML添加顶级根并不难:)你说得对。我正试图解决我们其中一个项目中的一个问题。该项目到处都在使用regexp。我已经使用regexp解决了这个问题。我别无选择。有可能这样做吗?我想我来晚了一点