黑马程序员技术交流社区

标题: String 用\\\\来切割的问题 [打印本页]

作者: 2528870651    时间: 2014-4-19 12:31
标题: String 用\\\\来切割的问题
本帖最后由 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. }
复制代码
不好意思还没有学到正则,不要用正则回答
[attach]39064[/attach]

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

捕获.PNG

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

捕获2.PNG

作者: 左拉    时间: 2014-4-19 12:36
本帖最后由 左拉 于 2014-4-19 12:43 编辑

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


作者: 2528870651    时间: 2014-4-19 12:40
左拉 发表于 2014-4-19 12:36
四个斜杠表示两个斜杠,一个斜杠转义一次
\(这是转义)\(这是"\")\(这又是转义)\(这是"\") ...

这我知道呢 要不然我怎么会说 “\\\”三个反斜杠会报错啊
作者: 左拉    时间: 2014-4-19 12:41
2528870651 发表于 2014-4-19 12:40
这我知道呢 要不然我怎么会说 “\\\”三个反斜杠会报错啊


split("\\+")试试这个看效果如何

作者: 2528870651    时间: 2014-4-19 12:43
左拉 发表于 2014-4-19 12:41
split("\\+")试试这个看效果如何

你看看吧 在图上

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

捕获.PNG

作者: 左拉    时间: 2014-4-19 12:45
split("\\{2}")这个呢
作者: 2528870651    时间: 2014-4-19 12:46
左拉 发表于 2014-4-19 12:45
split("\\{2}")这个呢

不行,结果和上面一样
作者: NewDemo    时间: 2014-4-19 13:09
楼主可以打印下数组长度就明白了,这就好比拿t去切tatbtbntgh刚开始就会有空行一样
作者: 呆呆沙师妹    时间: 2014-4-19 13:30
本帖最后由 呆呆沙师妹 于 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.
         */
作者: 2528870651    时间: 2014-4-19 13:36
呆呆沙师妹 发表于 2014-4-19 13:30
查看String.java源码,可看到split可接收的字符串必须满足以下两个要求:
1、当接收的字符串长度为1,要保 ...

谢谢!!
作者: NewDemo    时间: 2014-4-19 14:26
呆呆沙师妹 发表于 2014-4-19 13:30
查看String.java源码,可看到split可接收的字符串必须满足以下两个要求:
1、当接收的字符串长度为1,要保 ...

活到老,学到老,一直对于源码有种恐惧感,看来还是可以看懂的,这次真是满载而归~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2