切割:还记得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,那规则的结果理解成泛型的实例化,那么你可以把这个规则封装成组.这个组里面的结果就会被重新再次使用
- 你比方说,现在"." 就代表字母d,那么,这个规则"." 的结果就是"d", 现在(.) 变成了(d)
- 当你想对一个规则的结果进行重用的时候,你可以把正则表达式理解成泛型T,那规则的结果理解成泛型的实例化,那么你可以把这个规则封装成组.这个组里面的结果就会被重新再次使用
- 那么当组封装完之后,会被自动地进行编号,这叫做第1组. 那么接下来我第2个位置是不是和第1组的结果是一致的啊,我怎么去使用第1组呢.使用 \1 表示去使用第1组. 通过\1看反向使用第1组,而正则表达式中反斜杠要进行 转义,所以"\1"被写成了"\\1"
- (.)\\1 也就是说,你第1位的内容,在第2位又出现了.
- 比如,"." 小数点现在代表d 那么(.)\\1 等价于 (d)\\1 进一步等价于 dd
- 如果小数点是q,那么(.)\\1 等价于 (q)\\1 进一步等价于 qq
- (.)\\1 也就是说,你第1位的内容,在第2位又出现了.
- 分组和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+
- 如果有3个字母相同呢
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)
-
- ((( )) ())
正则表达式的弊端是,正则越长,阅读性越差.别人写的正则,你自己看了半天看不懂