------- android培训、java培训、期待与您交流! ----------
正则表达式:符合一定规则的表达式.(也就是一个特殊的字符串形式)
作用:用于专门操作字符串.是一个操作字符串的规则.
其实正则表达式就是用一些字符表示一堆代码。这样就简化了书写。
所以学习正则表达式就是在学习一些特殊符号的使用。
具体操作功能:
[abc] 表示这个部分可以用来判断一个字符串当中某一个字符位上出现的字符,要么是a或b或c,而且这个字符串只能有一个字符。
[a-z] 与上边含义相同,不过,是用来判断字符串当中某一个字符位上出现的字符是否在a-z这个范围中。
[^abc]表示某一个字符位上的字符除了a,b,c其他的都行,也就是 非(!)的意思
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
但是上边的判断只是一位一位的去判断。下边还应该去判断这个位上的限定字符出现的次数。
数量词的概念:
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X ,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
匹配:Matches方法用规则去匹配整个字符串,只要一个不符合,就返 回false
切割:String split 可以使用复杂形式的去切割
在使用split进行切割的时候,比如reg=“abc”;str=“dsabc234”;
首先在str中寻找满足reg的字符字串,直到找到满足的,然后将满足字串的左右切割出来。
例如
String string = "zhangsan lisi wangwu";
String reg = " +";
//这里使用规则去匹配,也就是用一个或者多个空格去切割。
String[] strings = string.split(reg);
得到zhansan
Lisi
Wangwu
下边的特别注意了:使用“.”去切割字符串的时候。
String string = "zhangsan.lisi.wangwu";
String reg = "\\.";
由于“.”是正则表达式中的一个符号。我们想要在正则表达式中写.这个符号
必须先写\.,而我把\.放在字符串中的时候,必须将”\”这个字符转义也就是使用\\去转义
String[] strings = string.split(reg);
String string="c:\\abc\\a.txt";
String reg = "\\\\";
String[] strings = string. split(reg);
下边使用正则表达式中的组的概念去按照叠词完成切割。
例如:
"jijoosfdsffklklklllewfwf"切割成按前后两个字符相同的去切割。
这就用到了正则表达式中的组的概念 ” (当中包含组中的字符) “
当你想要对一个规则的结果进行重用的时候,那么你可以把它封装成组,这个组中的结果就可以再新使用。组封装好之后,有一个自动的编号,从1开始。
而在引用各个组的结果时候,就使用\组号(也就是括号出现的位置)。
"jijoosfdsffklklklllewfwf".split("(.)\\1")。
切割与匹配的最大区别在于:匹配只要不满足,就返回false
而切割当不满足时候,继续向下进行匹配后切割。
比如说上例:
找到j 然后去看第二位是否是j,不是,则继续找第二位的i,看第三位是否是i,依次类推。直到oo 然后将字符串切割为jij sfdsffklklklllewfwf,然后继续寻找第二的字串中是否满足正则表达式中的定义。然后依次类推。
当想要使用oooooo这种形式去切割的时候,使用 "(.)\\1+" 也就表示后边一个或多个字符和第一个字符相等的时候切割。
复杂的组。
((A)(B(C)))
注意:有几个左括号,就有几个组,也就是上边这个有4个组。
组的编号就是这个左括号出现的次序。
在操作复杂的组时候,将所有的组的括号去掉就是原始的正则表达式。仅仅是引用这些里边的结果使用不同的组号罢了。
替换:
替换负责的字符串的时候,就要用到正则表达式了
replaceAll(Stringregex, String replacement)
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
自定义了一个替换函数
public static void replaceAllReg(String oldString,String reg,String newString)
{
oldString = oldString.replaceAll(reg,newString);
//将符合规则的部分用新的字串去替换。
System.out.println(oldString);
}
String oldString = "dsfasadf324234dsf324sf32r23sf3224f2";
replaceAllReg(oldString,"\\d+","#");
将所有的数字转换成“#”
例子:将叠词替换成“#”
String oldString = "sfdasffddddfdsfewweeefsdfaads";
replaceAllReg(oldString,"(.)\\1+","#");
那么我想将所有出现的叠词。例如ppp转成p,也就是将多个字母转成一个字母(与前边的多个字母相同),也就是新的字符串要引用旧字符串中组中的字符,怎么办呢,在替换中有特殊的符号,“$”专门用来在新字符串中引用前边旧字符串中组的内容。
replaceAllReg(oldString,"(.)\\1+","$1");使用,也就是将ff-->f这种形式。
正则表达式中的第四个功能:获取,也就是我想按照规则,将符合规则的字串取出来。而在前边学习的取字串,是通过下标来取得,十分的简单,现在的需求是取中满足指定规则的子串。
操作步骤:
1. 将正则表达式封装成对象。
2. 让正则对象和要操作的字符串相关联。
3. 关联后,获取正则匹配引擎。
4. 通过引擎对符合规则的子串进行操作,比如取出。
//找到三个字符组成的单词。
String str = "ming_woa_woa_i_ni";
String reg = "";
//1.将规则封装成对象。
Pattern p = Pattern.compile(reg);
//2.让正则对象和要作用的字符串相关联。返回一个Matcher对象。
Matcher m = p.matcher(str);
//这个Matcher对象通过解释Pattern对character sequence执行匹配操作的引擎。
//Matcher叫做引擎也叫做匹配器。可以对这个字符串有多个操作,封装到了这个对象中。
//由它拿的这个规则去作用到这个字符串上。去找到那些符合规则的字串。
//其实String类中的matches方法,用的就是pattern和matcher对象来完成的。
//只不过是被封装了。用起来较为简单。
boolean b = m.find();//将规则作用到字符串上,并进行符合规则的字串查找。
System.out.println(m.group());//得到第一个符合规则正则的字串。并返回。
在这里就需要使用边界匹配器了。指定正则表达式中以某些边界去匹配。
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾
使用正则表达式的四种功能的思路方式:
1. 如果只想知道该字符是否对于错,使用匹配。
2. 如果将已有的字符串变成另一个字符串。使用替换
3. 想要按指定的方式将一个字符串变成多个字符串,切割。规则以外的字串。
4. 想要拿到符合需求的字符串字串,获取符合规则的字串。