为什么这段代码不能正常工作?

时间:2012-06-06 18:30:32

标签: java regex pattern-matching substring matcher

为什么这段代码:

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

工作正常。

3 个答案:

答案 0 :(得分:8)

工作。你的模式

^.*pattern.*$

说匹配:

  1. 从头开始
  2. 接受任意数量的字符
  3. 后跟字符串pattern
  4. 后跟任意数量的字符
  5. 直到字符串结尾
  6. 结果是整个输入字符串。如果你只想找到单词pattern,那么正则表达式就是单词本身,或者你发现的那样,用字边界元字符括起来。

答案 1 :(得分:4)

并不是第一个例子不起作用,而是你无意中要求它比你想要的更多。

.*表达式展开以包含“pattern”之前的所有字符以及pattern之后的所有字符,因此整个表达式与整行匹配。

使用第二个示例,您只指定它匹配“pattern”之前和之后的空格,以便表达式匹配 模式,加上几个空格。

答案 2 :(得分:1)

问题在于你的正则表达式:"^.*" + keyword + ".*$"

表达式.*匹配字符串中的字符数。这意味着它实际匹配整个字符串。在整个字符串之后,它无法找到您的关键字。

要使其正常工作,您必须使其变得贪婪,即在.*之后添加问号:

"^.*?" + keyword + ".*$"

这一次.*?匹配您的关键字后跟的最小字符。