黑马程序员技术交流社区

标题: 问一个很基础的问题 [打印本页]

作者: 付蛟龙    时间: 2012-7-5 00:22
标题: 问一个很基础的问题
本帖最后由 付蛟龙 于 2012-7-8 18:27 编辑

/*
以.为标记 把字符串分割成字串
*/
1.    public class  getLastname
2.    {
3.         public static void main(String[] args)
4.        {
5               String s1="abc.txt";
6              String[] s2=s1.split("."); //分割字符串
7
8              for(int x=0; x<s2.length; x++)      
9                  System.out.println(s1[x]);// 打印子串;
10        }
11   }
   这是个很简单很基础的字符串小程序,目的是以.将字符串s1分为若干子串,并打印出来。但上述代码编译 形成class文件执行后无任何输出。在第九行加入System.out.println(s2.length);  打印字符串数组长度 发现为0.说明第六行并未执行,  然后将第六行改为String[] s2=s1.split("\\.");  程序运行正常 并得到想要的结果

我的问题是 为什么会这样? 是不是与转义字符有关?菜鸟求解

作者: 贾飞雨    时间: 2012-7-5 00:37
网上找的
import java.util.regex.Matcher;  
import java.util.regex.Pattern;  
  
  
public class test {  
  
    /**
     * @param args
     */  
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
        String textString = new String ("\\\"");  
         
        Pattern pt=Pattern.compile("\\\\\"");  
         
        Matcher mc=pt.matcher(textString);  
         
             mc.replaceAll("xx");  
         
        //textString.replaceAll("\\", "xx");  
         
        String bl=mc.replaceAll("xx");  
         
        System.out.println(textString);  
        System.out.println(bl);  
        }  
  
}  


分析一下“\\\\”,第一个斜杠是转义符,第二个斜杠是斜杠本身,第三个斜杠是转义符,第四个斜杠是斜杠本身。

有2点要清楚:
1.字符串里面表示斜杠就需要两个斜杠如“\\”
2.正则表达式里的斜杠需要转意,是用“\\”标示。
这样就比较好解释:
我们先要表示正则表达式里面的斜杠“\\”,然后再用字符串表示出来。而这2个斜杠分别需要一个转义符,这样就成了4个斜杠在正则表达式里面表示一个斜杠。  原来是这样!
http://www.iteye.com/wiki/problem/13730
作者: 贾飞雨    时间: 2012-7-5 00:37
后面那个是链接 楼主赋值一下看吧
作者: 赵庆礼    时间: 2012-7-5 00:43
因为  “.”是转义字符,所以要加“\\”
还有其他的一些加\\的。如下,希望这些能帮助你

1、如果用“|”作为分隔的话,必须是如下写法:String.split("\\|"),这样才能正确的分隔开,不能用String.split("|");
“.”和“|”都是转义字符,必须得加"\\";
2、如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如:“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",如果要分隔就应该这样才能得到正确结果




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