------- android培训、java培训、期待与您交流! ----------
正则表达式,最重要的还是四个功能。另外最好记住常用的字符匹配。
一、概念理解:
正则表达式:符合一定规则的表达式。
作用:用于专门操作字符串。
特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。所以学习正则表达式,就是在学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。
二、具体操作功能:
1,匹配:String matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
主要方法:boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式。
正则表达式构造,简单举例说明:
对QQ号进行校验,要求:5~15位,0不能开头,只能是数字。就可以构造一个正则表达式如下: String regex = “[1-9][0-9]{4,14}” 意思是:第一位字符只能是1-9之间的数字,第二位只能是0-9之间的数字可以出现4-14次。
举例:对邮件地址进行校验。
public static voidcheckMail()
{
String mail ="[email protected]";
mail= "[email protected]";
Stringreg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配。
//reg ="\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。
//mail.indexOf("@")!=-1//第三种方法,但不建议使用
System.out.println(mail.matches(reg));
}
2,切割:String split();
主要方法:String的String[] split(regex)方法。
但要注意split()括号里面的是reg字符串,都有“”的,应该多注意转义字符。故regex定义的时候一定要考虑转移字符的影响。
如,对于用一个点切割,该这样定义 String reg =” \\.”;因为在正则表达式中单独一个点代表任意字符,\.代表真正的点,考虑到反斜杠的转义作用,应该用”\\.” 注意,反斜杠后面有个点。
地址字符串中的目录分隔符(\\)要用两个。
用反斜杠切割,定义: String str = “\\\\“;
组的概念:
按照叠词完成切割,为了可以让规则的结果可以被重用,可以将规则封装成一个组,用()完成,组的出现都有编号。从1开始,想要使用已有的组,可以通过\n(n就是组的编号)来获取。但在字符串中,考虑到反斜杠转义作用,应写成\\n。 总之,两个\代表一个\。
举例:
class RegexDemo
{
public static voidmain(String[] args)
{
splitDemo("zhangsan.lisi.wangwu","\\.");
splitDemo("c:\\abc\\a.txt","\\\\");
splitDemo("erkktyqqquizzzzzo","(.)\\1+");
}
3,替换:就是将符合一定规则的字符串替换成新的字符串。
主要方法:String replaceAll(regex,新字符串);
如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。
str.replaceAll(“(.)\\1+”,”$1”);
其中,$n $表示从外界(不在一个双引号内)获取前面正则表达式中的一个组,n标示组的序号(组号是从1开始的,因为被操作的字符串默认为0组)。
举例如下:将以下字符串编程简单的一句话。
public static void test_1()
{
String str ="我...我我...我要..要要...要要...去去去...黑马";
/*
将已有字符串变成另一个字符串。使用 替换功能。
1,可以先将 . 去掉。
2,在将多个重复的内容变成单个内容。
*/
str =str.replaceAll("\\.+","");
System.out.println(str);
str =str.replaceAll("(.)\\1+","$1");
System.out.println(str);
}
4,获取(重点):将字符串中符合规则的字串取出。
操作步骤:
1. 将正则表达式封装成对象。Pattern.compile(reg)
2. 让正则对象和要操作的字符串相关联。用 matcher(str)方法
3. 关联后获取正则匹配引擎。就是matcher()方法返回的Matcher对象,也叫匹配器。
4. 通过引擎对符合规则的字串进行操作。比如匹配用matches()方法,和取出。
注意:
1. 同一个匹配器用的是同一个指针。
2. 先找(匹配)才能取。用group()方法进行获取之前要先做查找/匹配的动作。
3. 正则表达式中的边界匹配器。要学会应用。比如单词的边界 \b .
4. 匹配器m的matches()方法,是将整个字符串和规则进行匹配,完全符合规则才返回true值。
类 Pattern,在java.util.regx包中。
典型的调用顺序是: (先定义要被操作的str,和用的正则表达式reg,)
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(str);
boolean b = m.matches();
在仅使用一次正则表达式时,可以简化地定义为:
boolean b = Pattern.matches(reg, str);
等效于上面的三个语句
它不允许重用已编译的模式。
用到的方法简析:
static Pattern compile(String regex) 将给定的正则表达式编译到模式中。
Matcher matcher(CharSequence input) 创建匹配给定输入与此模式的匹配器。
Matcher类:通过解释 Pattern 对 character sequence 执行匹配操作的引擎。
Matcher类的主要方法:
boolean matches()尝试将整个区域与模式匹配。
boolean find() 尝试查找与该模式匹配的输入序列的下一个子序列
String group() 返回由以前匹配操作所匹配的输入子序列。(要先匹配一次才可以进行该操作)
int start();
int end();
举例如下:
mport java.util.regex.*;
class RegexDemo2
{
public static voidmain(String[] args)
{
getDemo();
}
public static voidgetDemo()
{
String str ="ming tian jiu yao fang jia le ,da jia。";
System.out.println(str);
String reg ="\\b[a-z]{4}\\b";
//将规则封装成对象。
Pattern p =Pattern.compile(reg);
//让正则对象和要作用的字符串相关联。获取匹配器对象。
Matcher m = p.matcher(str);
while(m.find())
{
System.out.println(m.group());
System.out.println(m.start()+"...."+m.end());
}
}
}
三、经验总结:到底用四种功能中的哪一个呢?或者哪几个呢?
思路方式:
1,如果只想知道该字符是否对是错,使用匹配。
2,想要将已有的字符串变成另一个字符串,替换。
3,想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。
4,想要拿到符合需求的字符串子串,获取。获取符合规则的子串。