为什么这段代码:
String keyword = "pattern";
String text = "sometextpatternsometext";
String patternStr = "^.*" + keyword + ".*$"; //
Pattern pattern = Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
int start = matcher.start();
int end = matcher.end();
System.out.println("start = " + start + ", end = " + end);
}
start = 0,end = 23
不能正常工作。
但是,这段代码:
String keyword = "pattern";
String text = "sometext pattern sometext";
String patternStr = "\\b" + keyword + "\\b"; //
Pattern pattern = Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
int start = matcher.start();
int end = matcher.end();
System.out.println("start = " + start + ", end = " + end);
}
start = 9,end = 16
工作正常。
答案 0 :(得分:8)
工作。你的模式
^.*pattern.*$
说匹配:
pattern
结果是整个输入字符串。如果你只想找到单词pattern
,那么正则表达式就是单词本身,或者你发现的那样,用字边界元字符括起来。
答案 1 :(得分:4)
并不是第一个例子不起作用,而是你无意中要求它比你想要的更多。
.*
表达式展开以包含“pattern”之前的所有字符以及pattern之后的所有字符,因此整个表达式与整行匹配。
使用第二个示例,您只指定它匹配“pattern”之前和之后的空格,以便表达式匹配 模式,加上几个空格。
答案 2 :(得分:1)
问题在于你的正则表达式:"^.*" + keyword + ".*$"
表达式.*
匹配字符串中的字符数。这意味着它实际匹配整个字符串。在整个字符串之后,它无法找到您的关键字。
要使其正常工作,您必须使其变得贪婪,即在.*
之后添加问号:
"^.*?" + keyword + ".*$"
这一次.*?
匹配您的关键字后跟的最小字符。