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

Dev*_*vvy 5 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 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Dev*_*vvy 6

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


JIE*_*ANG 3

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

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;
}
Run Code Online (Sandbox Code Playgroud)