【问题标题】:Why this code don't work properly?为什么这段代码不能正常工作?
【发布时间】:2012-06-10 19:28:25
【问题描述】:

为什么是这个代码:

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

工作正常。

【问题讨论】:

  • +1 个结构良好的问题,具体,包含所有相关细节。

标签: java regex pattern-matching substring matcher


【解决方案1】:

确实工作。你的模式

^.*pattern.*$

说要匹配:

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

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

【讨论】:

    【解决方案2】:

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

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

    在您的第二个示例中,您只指定它匹配“模式”前后的空格,因此表达式匹配 大部分 模式,外加几个空格。

    【讨论】:

      【解决方案3】:

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

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

      要让它工作,你必须让它变得贪婪,即在.*之后添加问号:

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

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

      【讨论】:

      • To make it working you have to make it greedy, i.e. add question sign after .* 你的意思是不贪心吧?
      猜你喜欢
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多