当它应该为true时,Matcher.Find()返回false

时间:2011-04-12 15:02:56

标签: java regex

        String s = "test";
        Pattern pattern = Pattern.compile("\\n((\\w+\\s*[^\\n]){0,2})(\\b" + s + "\\b\\s)((\\w+\\s*){0,2})\\n?");
        Matcher matcher = pattern.matcher(searchableText);
        boolean topicTitleFound = matcher.find();
        startIndex = 0;
        while (topicTitleFound) {
            int i = searchableText.indexOf(matcher.group(0));
            if (i > startIndex) {
                builder.append(documentText.substring(startIndex, i - 1));
        ...

这是我的文字:

  

有些文字来到这里

  topicTitle测试:   
test1:testing123   
test2:testing456   
test3:testing789   
test4:testing9097

当我在http://regexpal.com/http://www.regexplanet.com上测试此正则表达式时,我清楚地找到了标题:“topicTitle test”。但是在我的java代码topicTitleFound中返回false。

请帮忙

2 个答案:

答案 0 :(得分:1)

您的'\r'中的换行符('\n')之前可能有回车符(searchableText)。这会导致匹配在行边界处失败。

要使多线模式更加健壮,请在编译正则表达式时尝试使用MULTILINE选项。然后根据需要使用^$来匹配行边界。

Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);

<强>更新

在实际测试出你的代码后,我发现模式匹配是否存在回车符。换句话说,您的代码“按原样”工作,而topicTitleFound在首次分配时(true循环之外)为while

您确定false获得了topicTitleFound吗?或者是循环中的问题?

顺便说一下,使用indexOf()是浪费和笨拙的,因为匹配器已经存储了组0开始的索引。请改用:

int i = matcher.start(0);

答案 1 :(得分:0)

你的正则表达式有点难以解密 - 不是很明显你想要做什么。需要注意的一件事是,你的正则表达式希望匹配以换行符开头,而示例文本则不会。