黑马程序员技术交流社区

标题: 帮忙解决正则表达式的错误,谢谢 [打印本页]

作者: 而今从头越2012    时间: 2013-1-2 13:21
标题: 帮忙解决正则表达式的错误,谢谢
下面一段代码总是报错,怎么回事?
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]);
      }
   }
}
不知是哪里错了,请教各位给出指点。
作者: 张森    时间: 2013-1-2 13:33
LZ 你|这里要转义才可以
String s[] = info.split("\\|");  |这个竖线要转义才可以
作者: sun~~    时间: 2013-1-2 13:54
lz 要转义的 String s[] = info.split("\\|");  
作者: 刘文超    时间: 2013-1-2 14:24
本帖最后由 刘文超 于 2013-1-2 14:26 编辑

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

不知道理解的是否有误,还希望大家推敲一下。
作者: 张会文    时间: 2013-1-2 15:15
本帖最后由 张会文 于 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=MTEyNDN8M2MwZTQ2NjAxZGVmMWUyYmM5NmExMWMxZDk4MGJjMDF8MTczMjIzMDEyNA%3D%3D&request=yes&_f=.jpg

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

36.JPG

作者: 冉世友    时间: 2013-1-2 23:16
一个重要经验:

正则表达式中反斜杠 \ 一般都是成对出现的,lz记好咯!
作者: 黄锦成    时间: 2013-1-3 00:07
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("\\|"); 这样才能得到正确的字符串结果





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