在java中发现了Matcher的find()方法的意外行为

时间:2016-05-05 13:40:02

标签: java

public class Test2 {

    public static void main(String[] args) 
    {
        String country="india";
        String arry[]={"indians are great","i am india","govt","dhoomindian","prashindiahim","i jdsdindi a","i n d i a"};
        Pattern p = Pattern.compile(".*" + country + ".*");
        for (String stringVal : arry) 
        {
            Matcher m = p.matcher(stringVal);
            System.out.println("test1..."+" -->"+stringVal+"  "+m.find());
            System.out.println("test2..."+" -->"+stringVal+"  "+m.find());
        }
    }
}


OUTPUT::

*test1... -->indians are great  true*   ----1
**test2... -->indians are great  false**-----2
*test1... -->i am india  true*   ----3
**test2... -->i am india  false** ---4
test1... -->govt  false
test2... -->govt  false
test1... -->dhoomindian  true----5
test2... -->dhoomindian  false----6
test1... -->prashindiahim  true----7
test2... -->prashindiahim  false----8
test1... -->i jdsdindi a  false
test2... -->i jdsdindi a  false
test1... -->i n d i a  false
test2... -->i n d i a  false

你可以看到相同的find()方法在第一行给出true而在前面的第二行给出false。你可以从第1-8行看到行为。 任何人都可以告诉我为什么我得到了find()方法的这种行为。

2 个答案:

答案 0 :(得分:2)

来自docs

  

public boolean find()   尝试查找与模式匹配的输入序列的下一个子序列。   此方法从此匹配器区域的开头开始,或者,如果前一次方法调用成功并且匹配器尚未重置,则在第一个字符与上一个匹配项不匹配时

答案 1 :(得分:0)

find()方法将搜索特定模式,如果找到则返回true,但是,如果再次调用find(),它会继续搜索 FROM THAT POINT ONWARD 在那个字符串中。在那里,你会得到错误的bcz它无法找到它。

如果您使用find(int location),您可以告诉它在要搜索的字符串中的哪个位置,从而允许您根据需要多次找到相同的模式。