正则表达式---获取英文双引号里面的内容

来源:互联网 发布:网络中了500万怎么领奖 编辑:程序博客网 时间:2024/05/02 05:56
有时我们会很烦恼,怎样获取英文  " "  里面的内容,因为英文的前后引号一样,会造成很多麻烦:
例如:The name "McDon ald's" is said "markudonarudo" in Japanese
String input = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
Pattern p = Pattern.compile("\"(.+)\""); 
//由于引号内可能存在空格以及其他除了"各种各样的字符,我可以使用排除型字符组[^], 但我首先试一下 .+
Matcher m = p.matcher(input);
int count = 0;
while(m.find()){
count ++;
System.out.println(count + "----使用 .:" + m.group(0));
}


结果为:
1----"McDon ald's" is said "markudonarudo"
顺着这条思路往下走,我发现我只是多匹配了一些字符,因为  .+ 可以匹配至少一个字符,由于正则的贪婪特性,它从M开始将后面的所有的字符
到Japanese的都全部匹配上了,但是由于
\"(.+)\"
最后还有个  "  结尾所以无法匹配,.+ 会让出一个字符让 "  来匹配,如果匹配不上继续让出字符,直到匹配成功或者无法让出宣告匹配失败
那么好吧,正则太贪婪了,正好有一种懒惰匹配,如示例中的:
String input = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
Pattern p = Pattern.compile("\"(.+?)\"");    
//只要在+后面加上一个简单的?就可以的到正确的结果
Matcher m = p.matcher(input);
int count = 0;
while(m.find()){
count ++;
System.out.println(count + "----使用 .:" + m.group(0));
}
.+?的意思是在匹配的前提下,尽可能少的匹配,怎么样理解尽可能少,如此例中,.+?本来可以像上一个例子中,匹配一大串,但是由于后面有个?总是催促:“你匹配好了没有,该我了吧?”,所以,.+心理很烦,变得很懒了,在第一“收尾的时候就停下来了,这样就得到了正确的结果。


1----使用 .:"McDon ald's"
2----使用 .:"markudonarudo"


现在看看这个懒惰的正则表达式:?放在括号外边行不行,当然不可以,那样?就成了最好匹配一次,即使不匹配也可以的元字符,所以懒惰的用法应该是紧跟着贪婪元字符的后面。
还有一点要注意的是使用环视的时候,由于环视不占用字符,只是占用位置
这样会得到三个答案:
String input = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
Pattern p = Pattern.compile("(?<=\")(.+?)(?=\")");    
//使用的是环视
Matcher m = p.matcher(input);
int count = 0;
while(m.find()){
count ++;
System.out.println(count + "----使用 .:" + m.group(0));
}


(?<=")代表这个位置的左边必须有一个 ”  ,既然正则不会占用 “ ,它只需要左边是 ”  右边是什么它不会管,这样我们可以认为它占用了一个什么都不是的缝隙位置,这个缝隙位置只有一个要求就是左边是 ” ,(?=\")的意思是占用两个字符之间的缝隙位置,缝隙位置的右边是“ ,此时由于环视都不会占用字符,而缝隙只是理解,并不存在真正的缝隙,这样匹配结束后的位置只是到达s  和 ”之间的位置,下一次匹配的时候就会把 “ 也匹配上


1----使用 .:McDon ald's
2----使用 .: is said 
3----使用 .:markudonarudo


所以使用环视有点不妥!
//还可以使用以下方式的排除环视
Pattern p = Pattern.compile("\"((?!\").)+\""); 
//(?!\").的意思是一个位置的右边不能是" ,然后后面接了一个.  ,就是说.表示的其他字符都行,就是不能是"
0 0
原创粉丝点击