zyf4005 2016-05-21 09:32 采纳率: 100%
浏览 2061
已采纳

关于java中正则表达式\\和\\\\的理解?请各位高手帮忙分析下。

    1.下面是jdk API中的原话:根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 "\b" 与单个退格字符匹配,而 "\\b" 与单词边界匹配。字符串字面值 "\(hello\)" 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 "\\(hello\\)"。 这段话怎么理解?

    2.这是thinking中的一段话:如果在其他语言中使用过正则表达式,那你就立刻能发现Java对反斜线\的不同处理.在其他语言中,\\表示"我想要在正则表达式中插入一个普通的(字面上的)反斜线,请不要给他任何特殊的意义."而在Java中,\\的意思是"我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义."例如,如果你想表示一位数字,那么正则表达式应该是\\d.如果你想插入一个普通的反斜线,则应该这样用\\\\.不过换行和制表符之类的东西只需使用单反斜线:\n\t.   怎么理解?
    3.看一下代码:

class Demo 
 {
   public static void main(String[] args) 
{
    System.out.println("a\\b".replaceAll("\","A"));//①
    System.out.println("a\\b".replaceAll("\\","A"));//②
    System.out.println("a\\b".replaceAll("\\\","A"));//③
    System.out.println("a\\\\b".replaceAll("\\\\","A"));//④
    System.out.println("a\\\\\\b".replaceAll("\\\\","A"));//⑤

 }
}
上面①到③为啥编译或者运行失败?④⑤却运行成功?求解释。

    4.字符串中的\是转移字符,那么在正则表达式中的\\和\\\\又该怎么理解呢?
  • 写回答

4条回答 默认 最新

  • little_how 2016-05-21 12:19
    关注

    1.java的转意字符为\,拥有字符转意的是\ " b t n r等;
    2.replaceAll调用的是模式,所以为用正则的模式来做替换;
    3.正则里面又有转意的元字符,如\S表示非空格,\s表示空格, \w \d等各自的一些表示。

    以上3点结合起来就是,想要\在java中存在,那么必须要转意 如\b在java属于转意,那么在正则的时候拿到的模式就是转意后的,
    所以想要正则的模式拿到目标的,那么需要对\进行转意,那么转意后的\在java中就不会对\b继续进行转意,那么该模式就为正则
    模式串了。

    不理解的可以继续提问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?