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。
请帮忙
答案 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)
你的正则表达式有点难以解密 - 不是很明显你想要做什么。需要注意的一件事是,你的正则表达式希望匹配以换行符开头,而示例文本则不会。