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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

下面一段代码总是报错,怎么回事?
public class test{
   public static void main(String[] args){
      String info = "XUCHENG:01|HEIMA:02|XU:03";
      String s[] = info.split("|");
      System.out.println("字符串的拆分:");
      for(int i=0; i<s.length; i++){
         String s2[] = s[i].split(":");
         System.out.println("\t|-" + s2[0] + "\t" + s2[1]);
      }
   }
}
不知是哪里错了,请教各位给出指点。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

7 个回复

倒序浏览
LZ 你|这里要转义才可以
String s[] = info.split("\\|");  |这个竖线要转义才可以
回复 使用道具 举报
lz 要转义的 String s[] = info.split("\\|");  
回复 使用道具 举报
本帖最后由 刘文超 于 2013-1-2 14:26 编辑

楼上几位都已经给出了正确的答案:"|" 需要转义下,写成"\\|"
即:
  1. String s[] = info.split("\\|");
复制代码
我再试着解释一下为什么要两个"\\"+"|":
正则表达式中有一类叫做“元字符(meta-character)”的特殊符号,它们并不匹配自身对应的字符,而具有其他的含义。
这个"|"就是其一,用来表示划分多选分支(X|Y表示X或Y)。
所以正则表达式匹配字符"|",要转义成"\|"。
然而,按照Java中字符串的规则,其中转义序列用来表示特殊字符,比如\n表示换行符,\t表示制表符,而\|并不是Java能识别的转义序列,当然要出错了。
为了表示“正则表达式中的\|”,我们传递给Pattern.compile()的字符串必须正确表示\|——在字符串中,应该写做 \\|。

不知道理解的是否有误,还希望大家推敲一下。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
本帖最后由 张会文 于 2013-1-2 15:21 编辑

String s[] = info.split("\\|");//你没有添加转义字符你的是String s[] = info.split("|");是不正确的。
其他常用的转义字符:
1.八进制转义序列:\ + 1到3位5数字;范围'\000'~'\377'
\0:空字符
2.Unicode转义字符:\u + 四个十六进制数字;0~65535
\u0000:空字符
3.特殊字符:就3个
\":双引号
\':单引号
\\:反斜线
4.控制字符:5个 \' 单引号字符
\\ 反斜杠字符
\r 回车
\n 换行
\f 走纸换页
\t 横向跳格
\b 退格
运行结果:
http://bbs.itheima.com/forum.php?mod=attachment&aid=MTEyNDN8NGM3YjUwOTlhOGM0NjA1NmY4MTk1MDNkMDcwZDk5YzR8MTcyNzA3MzMyNw%3D%3D&request=yes&_f=.jpg

36.JPG (16.02 KB, 下载次数: 65)

36.JPG

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
一个重要经验:

正则表达式中反斜杠 \ 一般都是成对出现的,lz记好咯!
回复 使用道具 举报
public class Test{
   public static void main(String[] args){
      String info = "XUCHENG:01|HEIMA:02|XU:03";
      String s[] = info.split("\\|");
      System.out.println("字符串的拆分:");

      for(int i=0; i<s.length; i++){
               
         String s2[] = s[i].split(":");
         System.out.println("\t|-" + s2[0] + "\t" + s2[1]);
               
      }
   }
}

我们看jdk doc中说明
public String[] split(String regex)
Splits this string around matches of the given regular expression.
参数regex是一个 regular-expression的匹配模式而不是一个简单的String,他对一些特殊的字符可能会出现你预想不到的结果,比如测试下面的代码:
用竖线 | 分隔字符串,你将得不到预期的结果
String[] aa = "aaa|bbb|ccc".split("|");
//String[] aa = "aaa|bbb|ccc".split("\\|"); 这样才能得到正确的字符串结果

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马