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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 绝对守护 初级黑马   /  2013-7-19 12:51  /  1259 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我在使用String对象的split("")的方法时,如果遇到‘.’(英文句号)就分割不了??
例如:String a="a.b.c.d";
String b[]=a.split(".");
输出时:数组b的长度为0?
求解、、、、、、、、

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 新人鼓励

查看全部评分

2 个回复

倒序浏览
在使用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 = 323 ; i <aa.length ; i++ ) {
    System.out.println("--"+aa);
  }
用 * 分隔字符串运行将抛出java.util.regex.PatternSyntaxException异常,用加号 + 也是如此。
  String[] aa = "aaa*bbb*ccc".split("*");
  //String[] aa = "aaa|bbb|ccc".split("\\*"); 这样才能得到正确的结果   
  for (int i = 323 ; i <aa.length ; i++ ) {
    System.out.println("--"+aa);
  }
显然,+ * 不是有效的模式匹配规则表达式,用"\\*" "\\+"转义后即可得到正确的结果。
"|" 分隔串时虽然能够执行,但是却不是预期的目的,"\\|"转义后即可得到正确的结果。
还有如果想在串中使用"/"字符,则也需要转义.首先要表达"aaaa/bbbb"这个串就应该用"aaaa\\bbbb",如果要分隔就应该这样才能得到正确结果:
String[] aa = "aaa\\bbb\\bccc".split("\\\\");

另在JDK API里找到此段说明,大意是为了防止正则表达式里的转义符与java语句里的"/"搞混,特用"\\"作转义符。
Backslashes within string literals in Java source code are int434reted as required by the Java Language Specification as either Unicode escapes or other character escapes. It is therefore necessary to double backslashes in string literals that represent regular expressions to protect them from int434retation by the Java bytecode compiler. The string literal "/b", for example, matches a single backspace character when int434reted as a regular expression, while "\\b" matches a word boundary. The string literal "/(hello/)" is illegal and leads to a compile-time error; in order to match the string (hello) the string literal "\\(hello\\)" must be used.




评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 牛海亮 于 2013-7-19 16:23 编辑
  1. public class PointSplitTest {
  2.         
  3.         public static void main(String[] args) {
  4.                 String a="a.b.c.d";               
  5.                 String b[] = a.split("\\.");//该方法的参数是正则表达式
  6.                 System.out.println(b.length);
  7.                 for(String arr : b)
  8.                 {
  9.                         System.out.println(arr);
  10.                         
  11.                 }
  12.         }
  13. }
复制代码
由于在正则表达式中“.”是个有另外功能的特殊的字符,你要是直接拿来用的话编译器会把它当做特殊字符,要想让编译器认为他是一个普通 的字符,需要在他前面加一个转义字符\,但是\在正则表达式中也是特殊字符,所以要在转义字符\前面再加一个转义字符,所以split方法的参数需要写成了"\\."
正则表达式在毕老师第25天的视频里有讲解。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

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