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

时间:2015-05-13 16:45:41

标签: 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;
}

在上面的代码中,我找到了第一个标记,然后我继续找到结束标记。我知道这个设置将会有一些未来的问题,这是一个progess的工作。但是,检查结束标记不起作用。据我所知,我的逻辑是合理的。我正在采取任何标签,并通过检查其结束标签。然后我将其扔进第二个模式,然后使用第二个匹配器检查匹配。 我的文字字符串是“<b>this test</b>”。它检测到<b>就好了但是当我在</b>上检查匹配时,它总是返回false。我已经让同行知道为什么会这样,但他们也不知所措。我不知道为什么会这样,任何想法?我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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