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() 检查与正则表达式匹配的字符串部分。
所以我遇到了问题,我需要检查字符串中简单的开始和结束 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() 检查与正则表达式匹配的字符串部分。