【问题标题】:Java pattern matcher behaviourJava 模式匹配器行为
【发布时间】:2014-11-14 09:13:44
【问题描述】:

假设我编译了一个正则表达式模式:

 String myString = "manifest"; 
 p = Pattern.compile( myPattern, Pattern.CASE_INSENSITIVE  );
 Matcher m = p.matcher( myString );
 if ( m.matches() ){
   .....
 }

例如,当我将myPattern 指定为ni 时,myString 不匹配。但是当我将 myPattern 指定为 .*ni.* 时,它就会匹配。

在我的代码的后面部分,我想用新模式替换 myPattern 中定义的任何内容。例如,如果我将 ni 指定为要替换的 2 个字符,那么它只会替换 ni。如果我指定 .*ni.* ,那么整个字符串将被新模式替换。现在我的问题是它不匹配。

有什么办法可以解决这个问题? 谢谢

【问题讨论】:

  • 直接使用 .replace ?
  • 你如何使用 m?

标签: java regex


【解决方案1】:

matches 尝试将 entire 输入与模式匹配(如文档中所述),当然manifestni 不完全匹配,但它是与.*ni.* 完全匹配。但是,例如,如果您使用find,它会在输入 的某处搜索模式。还有lookingAt,它试图匹配输入中“当前”位置的模式。

【讨论】:

  • 嗨,谢谢,我使用了matches。所以我应该使用find ...我会试一试。谢谢
【解决方案2】:

这完全取决于您使用哪种Matcher 方法:

  • matches(): 当且仅当整个区域序列与此匹配器的模式匹配时才为真
  • find(): 当且仅当输入序列的子序列匹配此匹配器的模式时为真

例子:

String input = "manifest";
Matcher m1 = Pattern.compile("ni").matcher(input);
System.out.println(m1.matches()); // false
System.out.println(m1.find()); // true
Matcher m2 = Pattern.compile(".*ni.*").matcher(input);
System.out.println(m2.matches()); // true
System.out.println(m2.find()); // false

另外,find() 允许您遍历匹配项:

while (m2.find()) {
    String groupX = m2.group(x);
}

【讨论】:

    猜你喜欢
    • 2015-04-28
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多