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:测试123
test2:测试456
test3:测试789
test4:testing9097


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

请帮忙

最佳答案

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

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

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




更新:

在实际测试完您的代码之后,我发现该模式与是否存在回车符相匹配。换句话说,您的代码“按原样”运行,并且第一次分配topicTitleFound时,它是true(在while循环之外)。

确定要为false获取topicTitleFound吗?还是问题出在循环中?

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

int i = matcher.start(0);

07-24 17:30