问题描述
publicclassTest{publicstaticvoidmain(String[]args){Patternp=Pattern.compile("^s[\d]{3}m$");Matcherm=p.matcher("<P>s123m</P>");while(m.find()){System.out.println(m.group());}}}为什么这个程序抓不出来?但是吧开头的^和结尾的$去掉就可以抓出来了。有人能帮忙解释下吗?
解决方案
解决方案二:
边界匹配器^行的开头$行的结尾你都看下api啊你这个正则的意思是必须以s开通m结尾懂了吧
解决方案三:
我当然知道。。。。但是我正则式写对了但是没取出来你说是为什么|?
解决方案四:
引用2楼solly0880的回复:
我当然知道。。。。但是我正则式写对了但是没取出来你说是为什么|?
不明白你意思你问问题自己都没搞清楚。。。
解决方案五:
引用2楼solly0880的回复:
我当然知道。。。。但是我正则式写对了但是没取出来你说是为什么|?
Matcherm=p.matcher("<P>s123m</P>");你这个字符串明显就不是以s开头且以m结尾的嘛你是<开头>结尾的,所以没有匹配到,当然没有结果楼上的说的得清楚,你也说知道,怎么还会不理解哩
解决方案六:
Matcherm=p.matcher("s123m</P>");这样就匹配了
解决方案七:
publicclassRegexTest{publicstaticvoidmain(String[]args){Stringstr="<P>s123m</P>";Patternpattern=Pattern.compile("[^</?p>](\w+)",Pattern.CASE_INSENSITIVE);Matcherma=pattern.matcher(str);if(ma.find()){System.out.println(ma.group());}}}
解决方案八:
引用2楼solly0880的回复:
我当然知道。。。。但是我正则式写对了但是没取出来你说是为什么|?
因为你没有写对,呵呵("<P>s123m</P>")匹配中间的s123m是不是;用两个断言就可以(?<=<P>)\w*\s*(?=</P>);//断言一个位置前面是<P>然后在这个位置跟着\w*\s*然后之后的位置得后面是一个</P>
解决方案九:
引用7楼viszl的回复:
引用2楼solly0880的回复:我当然知道。。。。但是我正则式写对了但是没取出来你说是为什么|?因为你没有写对,呵呵Javacode("<P>s123m</P>")匹配中间的s123m是不是;用两个断言就可以(?<=<P>)\w*\s*(?=</P>);//断言一个位置前面是<P>然后在这个位置跟着\w*\s*然后之后的位置得后面是一个</P>
这个应该不对吧,“?<=”匹配的是缝隙前的,"?="匹配的是缝隙后的
解决方案十:
引用8楼closewbq的回复:
这个应该不对吧,“?<=”匹配的是缝隙前的,"?="匹配的是缝隙后的
哪里不对啊,分别断言s123m前面和后面的两个位置。刚才测试了一下,正常