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难题2
  • ¥15 一道python难题
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备