正则表达式(二)-正则表达式的切割

切割:还记得stirng的split的方法吗.可以按照"空格,竖线"对字符串进行切割.
正则表达式的切割:是指,我们按照正则表达式的规则对字符串来进行一些复杂的切割
比方说现在我想按照多个空格来进行切割
String str = "zhangsan lisei wangwu";
String reg = "\\s+"; //\\s在这里代表多个空格.+代表多个空格

String[] arr = str.split(reg);

for(String s :arr){
System.out.println(s);
}


zhangsan
lisei
wangwu

现在我想用 . 来进行切割
String str = "zhangsan.lisei.wangwu";
String reg = "."; //\\s在这里代表多个空格.+代表多个空格

String[] arr = str.split(reg);

for(String s :arr){
System.out.println(s);
}


会发现这样切割不出任何的字符串

正确的方法是
String str = "zhangsan.lisei.wangwu";
String reg = "\\."; //\\s在这里代表多个空格.+代表多个空格

String[] arr = str.split(reg);

for(String s :arr){
System.out.println(s);
}
反斜杠要注意的问题
切割 c:\\abc\\a.txt   按照\\来进行切割

String str = "c:\\abc\\a.txt";
String reg = "\\\\";    注意使用"\\" 来切割字符串.你可以认为使用1个"\" 则在规则中需要用"\\" .使用2个"\\"来进行切割,需要用"\\\\" 来进行切割

String[] arr = str.split(reg);

for(String s :arr){
System.out.println(s);
}

组的概念
按照叠词来进行切割
你比方说我现在想切割
  • "erkktyqquizzo"   这个字符串,我想按照,叠词来进行切割
  • 什么是叠词啊,像kk,qq 这样的两个连续出现的词,就是叠词
-好,现在我要求你给我用叠词切割我这个字符串.str,你怎么办?
--我可以先用dd,得到的string类型的数组再用qq切啊.
-我去,也可以啊.但是程序太多啦.

String str = "gengddcongqqshuo";
String reg = "dd";  

String[] arr = str.split(reg);   //我用叠词 dd 来切割字符串.

  • 难道,我就不能用一种通用的模板将所有的叠词都表示出来吗?
    • 我怎么表示后边的一个字母和前一个就是一样的呢?
  • 分组
    • 叠词的第1位可以是任意的字符,所以我用"." 小数点,来表示这个任意的字符.
    • 这个第1位匹配结束之后.第2位就必须得是第1位的字符的再一次出现.那么就说明什么,第1位的结果,再被第2位重用
    • 我把要重用的部分,用() 括起来,这就叫封装成了一个组.组会有自动的编号,编号从1开始
      • 当你想对一个规则的结果进行重用的时候,你可以把正则表达式理解成泛型T,那规则的结果理解成泛型的实例化,那么你可以把这个规则封装成组.这个组里面的结果就会被重新再次使用 
        1. 你比方说,现在"." 就代表字母d,那么,这个规则"." 的结果就是"d", 现在(.) 变成了(d)
    • 那么当组封装完之后,会被自动地进行编号,这叫做第1组. 那么接下来我第2个位置是不是和第1组的结果是一致的啊,我怎么去使用第1组呢.使用  \1  表示去使用第1组.  通过\1看反向使用第1组,而正则表达式中反斜杠要进行 转义,所以"\1"被写成了"\\1"
      • (.)\\1   也就是说,你第1位的内容,在第2位又出现了.
        1. 比如,"." 小数点现在代表d  那么(.)\\1   等价于 (d)\\1  进一步等价于  dd
        2. 如果小数点是q,那么(.)\\1      等价于 (q)\\1      进一步等价于  qq
    • 分组和matcher不一样,当匹配不中的时候,组不停止会继续往下走

String str = "gengddcongqqshuo";
String reg = "(.)\\1";     

String[] arr = str.split(reg);

for(String s :arr){
System.out.println(s);
}

//匹配的过程是这样的.
/*
* 匹配第1位g 则小数点".",被赋值为 g 
* 接下来匹配第2位,第2位是e,不中.和matcher不一样,当匹配不中的时候,组不停止会继续往下走
* 走过了n,g 都没有中
* 此时,遇到了d,小数点"." 被赋值成了d
* 等到了下一位,还是一个d,好了,这次\\1终于也中了.开始对单词来进行切分
* 循环如下的过程
* */

    • 如果有3个字母相同呢
      • (.)\\1+

String str = "gengdddcongqqshuo";
String reg = "(.)\\1+";     

String[] arr = str.split(reg);

for(String s :arr){
System.out.println(s);
}

//匹配的过程是这样的.
/*
* 匹配第1位g 则小数点".",被赋值为 g 
* 接下来匹配第2位,第2位是e,不中.和matcher不一样,当匹配不中的时候,组不停止会继续往下走
* 走过了n,g 都没有中
* 此时,遇到了d,小数点"." 被赋值成了d
* 等到了下一位,还是一个d,好了,这次\\1终于也中了.开始对单词来进行切分
* 循环如下的过程
* */
    • ((( )) ())
      • 这有几个组呢?你就看左括号的个数,有几个左括号就有几组
      • 第1个左括号是第1组,第2个左括号是第2组...
    • ((A)(B(C)))
      • 1     ((A)(B(C)))
        2     (A)
        3     (B(C))
        4     (C)
正则表达式的弊端是,正则越长,阅读性越差.别人写的正则,你自己看了半天看不懂

你可能感兴趣的:(Java正则表达式)