黑马程序员技术交流社区
标题:
求解释
[打印本页]
作者:
张雪萍
时间:
2013-3-13 01:14
标题:
求解释
本帖最后由 张雪萍 于 2013-3-13 09:47 编辑
public class testSplit{
public static void main(String args[])
{
String str ="1\2\3";
try{
System.out.println((str.split("\\").length));
}catch(Exception e){
System.out.println("error");
System.err.println(e.getMessage());
}
}
}
抛出错误:Unexpected internal error near index 1
\
^
请问是哪出问题了?谢谢拉!
作者:
曾钦
时间:
2013-3-13 01:41
刚好evernote里有关于这方面的笔记。。、
妹子的问题必须给力。。
java 数组 split~java 中 split() 一点经验
特别注意的是:如果使用“\”分割,则需要使用“\\\\”来分割!
在java.lang包中有String.split()方法,返回是一个数组
我在应用中用到一些,给大家总结一下,仅供大家参考:
1、如果用“.”作为分隔的话,必须是如下写法:String.split("\\."),这样才能正确的分隔开,不能用String.split(".");
2、如果用“|”作为分隔的话,必须是如下写法:String.split("\\|"),这样才能正确的分隔开,不能用String.split("|");
“.”和“|”都是转义字符,必须得加"\\";
3、如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如:“acount=? and uu =? or n=?”,把三个都分隔出来,可以用String.split("and|or");
使用String.split方法分隔字符串时,分隔符如果用到一些特殊字符,可能会得不到我们预期的结果。
我们看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("\\|"); 这样才能得到正确的结果
for (int i = 0 ; i <aa.length ; i++ ) {
System.out.println("--"+aa[i]);
}
用竖 * 分隔字符串运行将抛出java.util.regex.PatternSyntaxException异常,用加号 + 也是如此。
String[] aa = "aaa*bbb*ccc".split("*");
//String[] aa = "aaa|bbb|ccc".split("\\*"); 这样才能得到正确的结果
for (int i = 0 ; i <aa.length ; i++ ) {
System.out.println("--"+aa[i]);
}
显然,+ * 不是有效的模式匹配规则表达式,用"\\*" "\\+"转义后即可得到正确的结果。
"|" 分隔串时虽然能够执行,但是却不是预期的目的,"\\|"转义后即可得到正确的结果。
还有如果想在串中使用"\"字符,则也需要转义.首先要表达"aaaa\bbbb"这个串就应该用"aaaa\\bbbb",如果要分隔就应该这样才能得到正确结果:
String[] aa = "aaa\\bbb\\bccc".split("\\\\");
作者:
曾钦
时间:
2013-3-13 01:44
楼上内容为evernote中的笔记。。。可能是哪年哪月从网上接下来的。。大家看到类似的不要吐槽。。
解决问题才是关键。
代码改成这样就可以了:
public class Demo {
public static void main(String[] args) {
String str = "1\\2\\3";
try {
String[] s = str.split("\\\\");
System.out.println((s.length));
} catch (Exception e) {
System.out.println("error");
System.err.println(e.getMessage());
}
}
}
作者:
HM李超
时间:
2013-3-13 02:17
正解代码是
public class testSplit
{
public static void main(String args[])
{
String str ="1\2\3";
try
{
System.out.println((str.split("\\\\").length)); //如果字符串中含有'\’;使用split转换时,应该传'\\\\'
}
catch(Exception e)
{
System.out.println("error");
System.err.println(e.getMessage());
}
}
}
复制代码
不过上面的运行结果是1,我想你应该想得到结果是3,代码是
public class testSplit
{
public static void main(String args[])
{
String str ="1\\2\\3";
try
{
System.out.println((str.split("\\\\").length)); //如果字符串中含有'\’;使用split转换时,应该传'\\\\'
}
catch(Exception e)
{
System.out.println("error");
System.err.println(e.getMessage());
}
}
}
复制代码
运行结果是3
分析: 使用String对象的public String[] split(String regex)方法时,如果String对象是以'\'分隔的话,必须在split中传入'\\\\'才能识别
对于上面的代码为什么输入的是1呢?你看看,String str ="1\2\3"; 打印一下发现str指向的是这个字符串 D:\1.png
因为str中包含了转义字符\,它将\2和\3都转义成了两个符号,如图,当用split("\\\\")拆分str时,str并不包含'\';所以得到的结果是一个
只有一个元素的数组,故其length=1;
再如第二道代码,String str ="1\\2\\3";'\'已经被转义,str中包含'\',所以用split方法拆分时,能得到一个包含3个元素的数组,故该
数组的length=3;
作者:
HM李超
时间:
2013-3-13 02:20
你先把try。。。catch块注释掉,然后打印一下str,看看str到底保存的是什么?上面发图又失败了,看不到啊,打印出来的是1加一个笑脸符号再加一个心形符号
作者:
李辉
时间:
2013-3-13 05:41
代码格式有点乱,代码也是需要整洁滴 {:soso_e197:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2