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