1

为什么这个代码:

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

开始 = 0,结束 = 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);
}

开始 = 9,结束 = 16

工作正常。

4

3 回答 3

8

确实有效。你的图案

^.*pattern.*$

说匹配:

  1. 从头开始
  2. 接受任意数量的字符
  3. 后跟字符串pattern
  4. 后跟任意数量的字符
  5. 直到字符串的结尾

结果是整个输入字符串。如果您只想找到单词pattern,那么正则表达式将只是单词本身,或者如您所见,用单词边界元字符括起来。

于 2012-06-06T18:33:07.693 回答
4

并不是第一个示例不起作用,而是您无意中要求它匹配的内容超出了您的预期。

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

在您的第二个示例中,您只指定它匹配“模式”之前和之后的空格,因此表达式主要匹配模式,加上几个空格。

于 2012-06-06T18:34:03.313 回答
1

问题出在您的正则表达式中:"^.*" + keyword + ".*$"

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

为了让它工作,你必须让它变得贪婪,即在后面添加问号.*

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

这次.*?匹配最少字符数,后跟您的关键字。

于 2012-06-06T18:36:13.993 回答