JavaSE基础中正则表达式Matcher类的获取功能--group(),解惑必采纳,谢谢
为了获取字符串s"dajiatingwoshuo,jintianyaoxiayu,bushangwanzixi,gaoxingbu?"中所有的三个字符组成的单词,创建模式...
为了获取字符串s "da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?"中所有的三个字符组成的单词,创建模式对象和匹配器对象后循环使用find()和group()。为什么这样取的单词不是相同的,而是可以取到所有三个字符的单词? 照我的理解,一次find()和group()只会找一个单词,那继续循环,字符串s并没有改变,第二次find()和group()找的还是同一个单词啊。 代码如下,解惑必采纳,感谢String s = "da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?";String regex = "\\b\\w{3}\\b";Pattern p = Pattern.compile(regex);Matcher m = p.matcher(s);while ( m.find() ) { System.out.println( m.group() ); }
展开
1个回答
展开全部
在Java中,正则表达式是按照从左至右的顺序对字符串进行扫描匹配的,首先,find()和group()都是Matcher类的函数,而不是String类的函数,所以find()和group()是对字符串从左至右扫描的函数,而不是对同一字符串反复扫描的函数.
比如m.find()函数,如果找到匹配的子字符串,它返回true,没有找到匹配的子字符串,它返回false.当写到while条件中时,它表示持续在原字符串中从左至右扫描,当发现有匹配的子字符串时,由m.group()捕获并输出,如果扫描到原字符串尾也没有发现匹配的子字符串,则返回false,跳出循环.
以你的程序为例,m.find()函数会在原字符串中持续从左至右扫描三个字符的以空格为边界的单词,直到字符串尾,而不会反复从头开始扫描原字符串,除非你在while循环中使用while(m.find(0)),m.find(0)表示从原字符串的第一个字符开始扫描匹配的子字符串,这样程序会反复从原字符串的第一个字符开始扫描匹配的子字符串,会陷入无限循环.
也就是说,find()和group()函数,只会对原字符串从左至右扫描一遍,这样当第二次while循环时,不会是从原字符串头重新开始,而是从上一次匹配的位置后面开始第二次搜寻.
比如m.find()函数,如果找到匹配的子字符串,它返回true,没有找到匹配的子字符串,它返回false.当写到while条件中时,它表示持续在原字符串中从左至右扫描,当发现有匹配的子字符串时,由m.group()捕获并输出,如果扫描到原字符串尾也没有发现匹配的子字符串,则返回false,跳出循环.
以你的程序为例,m.find()函数会在原字符串中持续从左至右扫描三个字符的以空格为边界的单词,直到字符串尾,而不会反复从头开始扫描原字符串,除非你在while循环中使用while(m.find(0)),m.find(0)表示从原字符串的第一个字符开始扫描匹配的子字符串,这样程序会反复从原字符串的第一个字符开始扫描匹配的子字符串,会陷入无限循环.
也就是说,find()和group()函数,只会对原字符串从左至右扫描一遍,这样当第二次while循环时,不会是从原字符串头重新开始,而是从上一次匹配的位置后面开始第二次搜寻.
追问
我刚刚在API里的find()方法里也看到了关于这个的描述了,答主答得很好,点赞
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询