Java matcher.matches() 在应该为真时返回假

Java matcher.matches() returning false when it should be true

所以我遇到了问题,我需要检查字符串中简单的开始和结束 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;
}

在上面的代码中,我找到了某个东西的第一个标签,然后我继续寻找结束标签。我知道此设置将来会出现一些问题,这是一项正在进行的工作。但是,结束标记的检查不起作用。据我所知,我的逻辑是合理的。我正在获取标签是什么,并通过检查它的结束标签。然后我将其放入第二个模式,然后使用第二个匹配器检查匹配项。 我的文本字符串是“<b>this test</b>”。它检测 <b> 很好,但是当我检查 </b> 上的匹配项时,它总是 returns 错误。我已经问过同行为什么会发生这种情况,但他们也不知所措。我不知道为什么会这样,有什么想法吗?我在这里错过了什么?

我不是很明白你的问题,不知道能不能解决你的问题,如果不能,请举几个例子快速理解你的问题。

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

好的,JB Nizet 回答了这个问题,但是我应该用 endMatcher.find() 代替 endMatcher.matches() 因为 .matches() 检查整个字符串是否匹配正则表达式,其中 .find() 检查与正则表达式匹配的字符串部分。