zoukankan      html  css  js  c++  java
  • 正则表达式---获取英文双引号里面的内容

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

    来源 http://blog.csdn.net/u010102284/article/details/17246413

    有时我们会很烦恼,怎样获取英文  " "  里面的内容,因为英文的前后引号一样,会造成很多麻烦:
    例如: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(""((?!").)+""); 
    //(?!").的意思是一个位置的右边不能是" ,然后后面接了一个.  ,就是说.表示的其他字符都行,就是不能是"

  • 相关阅读:
    【JavaScript DOM 编程艺术】 笔记
    如何循序渐进有效学习 JavaScript?
    如何正确学习JavaScript
    HTML5学习
    window上杀死node进程
    HTML5:离线存储
    js面向对象的理解
    H5项目常见问题及注意事项
    查找已连接过的wifi密码
    flex的兼容
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/8228328.html
Copyright © 2011-2022 走看看