A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 2528870651 高级黑马   /  2014-4-19 12:31  /  1621 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 2528870651 于 2014-4-19 12:45 编辑
  1. </blockquote></div><div class="blockcode"><blockquote>package it.cast;


  2. public class Test1{

  3.     public static void main(String[] args){
  4.                     String str = new String("c:\\\\pubwa\\txt\\abc\\defg");
  5.                     //这个地方的“\”反斜杠如果是单数,也许会报错,
  6.                     //因为一些字符没有转义字符,如:“\p”
  7.                       //“\\”代表转移字符“\”
  8.                     
  9.                     //String[] arr = str.split("\\\\");
  10.                     //我用“\\\\”四个反斜杠来切,切出来了,可以运行
  11.                     //但是结果却不是预料中的,c:下面怎么有一个空行????
  12.                     //txt abc defg 怎么切出来了??我用“\\\\”四个反斜杠来切的啊,
  13.                     //怎么"\\"2个反斜杠的也可以切出来啊 ????
  14.                     //如下图
  15.                     
  16.                     String[] arr = str.split("\\");
  17.                     //这里我用“\\”两个反斜杠来切,结果便以失败。这是为什么?
  18.                     //如下图
  19.                     
  20.                     for(int x=0; x< arr.length; x++ )
  21.                     {                           
  22.                             System.out.println(arr[x]);
  23.                     }
  24.                     

  25.     }

  26. }
复制代码
不好意思还没有学到正则,不要用正则回答


捕获.PNG (159.82 KB, 下载次数: 36)

捕获.PNG

捕获2.PNG (148.23 KB, 下载次数: 54)

捕获2.PNG

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

11 个回复

倒序浏览
本帖最后由 左拉 于 2014-4-19 12:43 编辑

四个斜杠表示两个斜杠,一个斜杠转义一次
\(这是转义)\(这是"\")\(这又是转义)\(这是"\")
三个斜杠肯定表示一个"\"和一个转义,肯定报错
split("\\+")试试这个看效果如何

回复 使用道具 举报
左拉 发表于 2014-4-19 12:36
四个斜杠表示两个斜杠,一个斜杠转义一次
\(这是转义)\(这是"\")\(这又是转义)\(这是"\") ...

这我知道呢 要不然我怎么会说 “\\\”三个反斜杠会报错啊
回复 使用道具 举报
2528870651 发表于 2014-4-19 12:40
这我知道呢 要不然我怎么会说 “\\\”三个反斜杠会报错啊


split("\\+")试试这个看效果如何
回复 使用道具 举报
左拉 发表于 2014-4-19 12:41
split("\\+")试试这个看效果如何

你看看吧 在图上

捕获.PNG (176.89 KB, 下载次数: 37)

捕获.PNG
回复 使用道具 举报
split("\\{2}")这个呢
回复 使用道具 举报
左拉 发表于 2014-4-19 12:45
split("\\{2}")这个呢

不行,结果和上面一样
回复 使用道具 举报
NewDemo 来自手机 中级黑马 2014-4-19 13:09:31
8#
楼主可以打印下数组长度就明白了,这就好比拿t去切tatbtbntgh刚开始就会有空行一样
回复 使用道具 举报
本帖最后由 呆呆沙师妹 于 2014-4-19 13:38 编辑

查看String.java源码,可看到split可接收的字符串必须满足以下两个要求:
1、当接收的字符串长度为1,要保证它不是“.$|()[{^?*+\\”其中任一字符;"\\"长度为1,且为特殊字符一员
2、当接收的字符串长度为2时,字符串第一位字符是反斜杠,但第二位字符不能是ASCII格式的数字或字母;"\\\\"长度为2,且第二位字符是'\\',故能正常切割。
在"c:\\\\"中,它切了两次,在"\\"与"\\"之间无其他字符故出现了空行。
String.java源码中split相关部分内容:
    public String[] split(String regex) {
        return split(regex, 0);
    }
    public String[] split(String regex, int limit) {
        /* fastpath if the regex is a
         (1)one-char String and this character is not one of the
            RegEx's meta characters ".$|()[{^?*+\\", or
         (2)two-char String and the first char is the backslash and
            the second is not the ascii digit or ascii letter.
         */

点评

这绝对的赞!  发表于 2014-4-19 13:57
回复 使用道具 举报 2 0
呆呆沙师妹 发表于 2014-4-19 13:30
查看String.java源码,可看到split可接收的字符串必须满足以下两个要求:
1、当接收的字符串长度为1,要保 ...

谢谢!!
回复 使用道具 举报
呆呆沙师妹 发表于 2014-4-19 13:30
查看String.java源码,可看到split可接收的字符串必须满足以下两个要求:
1、当接收的字符串长度为1,要保 ...

活到老,学到老,一直对于源码有种恐惧感,看来还是可以看懂的,这次真是满载而归~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马