Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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 matcher.matches()在应该为true时返回false_Java_Regex_Matcher - Fatal编程技术网

Java matcher.matches()在应该为true时返回false

Java matcher.matches()在应该为true时返回false,java,regex,matcher,Java,Regex,Matcher,所以我有一个问题,我需要检查字符串中简单的开始和结束HTML标记。我没有遇到任何问题的开始标记是当我试图找到我有问题的结束标记时 private Pattern pattern; private Matcher matcher; private Pattern endPattern; private Matcher endMatcher; private static final String HTML_TAG_PATTERN = "<([a-zA-Z]+)>"; public b

所以我有一个问题,我需要检查字符串中简单的开始和结束HTML标记。我没有遇到任何问题的开始标记是当我试图找到我有问题的结束标记时

private Pattern pattern;
private Matcher matcher;
private Pattern endPattern;
private Matcher endMatcher;

private static final String HTML_TAG_PATTERN = "<([a-zA-Z]+)>";
public boolean hasCorrectHTML(String checking)
{
    boolean ret=true;
    pattern=Pattern.compile(HTML_TAG_PATTERN);
    matcher=pattern.matcher(checking);

    while(matcher.find() && ret)
    {
        String htmlEndTag="</"+matcher.group(1)+">";

        endPattern=Pattern.compile(htmlEndTag);
        endMatcher=endPattern.matcher(checking.substring(matcher.end()));

        ret=endMatcher.matches();
    }

    return ret;
}
私有模式;
私人匹配器匹配器;
私有模式;
私有匹配器endMatcher;
私有静态最终字符串HTML_TAG_PATTERN=“”;
公共布尔值hasCorrectHTML(字符串检查)
{
布尔ret=真;
pattern=pattern.compile(HTML\u TAG\u模式);
匹配器=模式匹配器(检查);
while(matcher.find()&&ret)
{
字符串htmlEndTag=“”;
endPattern=Pattern.compile(htmlEndTag);
endMatcher=endPattern.matcher(checking.substring(matcher.end());
ret=endMatcher.matches();
}
返回ret;
}
在上面的代码中,我找到了某物的第一个标记,然后继续查找结束标记。我知道这个设置将来会有一些问题,这是一个正在进行的工作。但是,检查结束标记不起作用。就我看来,我的逻辑是正确的。我拿着标签上的任何东西,并检查它的结束标签。然后我将其放入第二个模式,然后使用第二个匹配器检查匹配。
我的文本字符串是“
此测试
”。它检测到的
很好,但当我在
上检查匹配项时,它总是返回false。我问过同行们为什么会发生这种情况,但他们也不知所措。我不知道为什么会这样,有什么想法吗?我在这里遗漏了什么?

我不太理解你的问题,我不知道我是否解决了你的问题,如果没有,请给我一些例子来快速理解你的问题

private Pattern pattern;
private Matcher matcher;
private Pattern endPattern;
private Matcher endMatcher;

private static final String HTML_TAG_PATTERN = "<([a-zA-Z]+)>[^<]*";
public boolean hasCorrectHTML(String checking)
{
    boolean ret=true;
    pattern=Pattern.compile(HTML_TAG_PATTERN);
    matcher=pattern.matcher(checking);

    while(matcher.find() && ret)
    {
        String htmlEndTag="</"+matcher.group(1)+">";

        endPattern=Pattern.compile(htmlEndTag);

        String endChecking = checking.substring(matcher.end());
        endMatcher=endPattern.matcher(endChecking);

        ret=endMatcher.matches();
    }

    return ret;
}
私有模式;
私人匹配器匹配器;
私有模式;
私有匹配器endMatcher;

private static final String HTML_TAG_PATTERN=“[^好的,这是由JB Nizet回答的,但是在endMatcher.matches()的位置,我应该放endMatcher.find(),因为.matches()检查整个字符串是否与正则表达式匹配,where.find()检查字符串中与正则表达式匹配的部分。

matches()测试整个字符串是否与模式匹配,正如您正确地找到开始标记所做的那样。或者更好,使用真正的HTML解析器,如JSoup。使用regexps进行HTML解析是一个死胡同。好的,这是有道理的。我会使用真正的HTML解析器,但为此我被特别告知这样做。我知道这很愚蠢,我也不同意,但这并不总是关于我。好的,所以我ets说我通过了这个测试。我的第一个html模式将找到开始标记()。如果它找到了任何东西,在本例中,它将进入while循环,它将获取第一个找到的内容并为其创建一个结束标记检查,就像这样。然后它将检查该结束标记的字符串的其余部分。问题是我使用的是.matches()与@JB_Nizet提到的.find()不同,where.matches()检查整个字符串是否在where。find()检查每个单独的字符串。好的,不管怎样,如果将HTML_标记_模式从“”更改为“[^