3

我试过这个例子只是交换两行它给出了不同的输出为什么

String inputString = "username@gmail.com"; 
String pattern="([a-z]+@)([a-z]+)(\\.[a-z]+)";
Pattern p = Pattern.compile(pattern); 
Matcher m = p.matcher(inputString); 

///变化发生在这里

if(m.find()) 
{
   String resultString = m.replaceAll("$1xxxx$3"); 
   System.out.println(resultString); 
}

System.out.println(m.matches());//line to be changed

输出 :

用户名@xxxx.com

真的

System.out.println(m.matches());//line changed     
if(m.find()) 
{
   String resultString = m.replaceAll("$1xxxx$3"); 
   System.out.println(resultString); 
}

输出:真

4

3 回答 3

5

Matcher.find从文档中提取

寻找

公共布尔查找()

尝试查找与模式匹配的输入序列的下一个子序列。此方法从该匹配器区域的开头开始,或者,如果该方法的先前调用成功并且匹配器此后尚未重置,则从前一个匹配不匹配的第一个字符开始

如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。

返回: true 当且仅当输入序列的子序列与此匹配器的模式匹配

因此,由于您调用Matcher.matches了 which 尝试匹配整个字符串,并且您没有重置匹配器,因此它尝试在第一个匹配之后查找开始。由于只有一个匹配项,因此它什么也找不到。

于 2012-11-13T14:11:35.057 回答
2

方法 replaceAll(String replacement) 的 javadoc 声明以下“调用此方法会更改此匹配器的状态。如果要在进一步的匹配操作中使用匹配器,则应首先将其重置。”

因此,我认为您会发现这种差异,因为匹配器在替换后不再处于相同状态。尝试全部替换后重置匹配器。

于 2012-11-13T14:47:34.587 回答
2

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/regex/Matcher.html#find ()

查找从上次使用匹配器时中断的地方开始

首先,这意味着 inputString 的开始。

但是,由于matches() 将整个inputString 考虑在内,这会将指针移动到末尾。结果,它不再找到,并且在这种情况下 find() 为假(作为其后续)

于 2012-11-13T14:14:25.463 回答