---------------------- android培训、java培训、期待与您交流! ----------------------
正则表达式
正则表达式:符合一定规则的表达式。
作用: 用于专门操作字符串
特点:用一些特定的符号来表示一些代码操作,这样就简化书写。所以学习正则表达式就是在学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作
弊端:符号定义越多,正则越长,阅读性越差。
对结果进行判断,定义标记。
具体操作功能:
1、匹配:String类中的matches方法。
用规则匹配整个字符串,只要有一处不符合规则,就匹配结束。返回false。
2、切割:Stringsplit()
3、替换:String replaceAll();
4、获取:将字符串中符合规则的子串取出(获取指定规则的字符串)
操作步骤:
1、现将正在表达式封装成对象
2、让正则表达式和要操作的字符串相关联。
3、关联后,获取正则匹配引擎。
4、通过引擎对符合规则的子串进行操作。比如取出。
为了可以让规则的结果被重用,可以将规则封装成一个组,用()表示。
组的出现都有编号,从1开始,想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取。
replaceAllDemo(str1,"(.)\\1+","$1");//通过$符号获取前面一个组。前提是有一个组。 |
4、获取:
用到的包是java.util.regex包里面只有两个类 :pattern、matcher和一个异常(runtimeexception)类。
发现:Pattern类没有构造函数(不让new对象)。那么肯定提供方法,而且是静态的,返回的是本类对象。 static Pattern compile(String regex) //将正则封装成对象。 Pattern p = Pattern.compile(reg);//注意大小写。 //让正则对象和要作用的字符串相关联。获取匹配器对象。 Matcher m = p.matcher(str); //获取。先找find。再通过group获取。 while (m.find()) { System.out.println(m.group()); } |
典型的调用顺序是:
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(str);
boolean b = m.matches();
其中:Pattern将正则表达字符串编译封装,然后调用matcher函数返回一个存放了结果的Matcher匹配器,Matcher里面有很多的方法,根据要求的不同可以返回不同的结果,而matches是全部匹配,返回布尔值。
import java.util.regex.*;
class RegexDemo2 { public static void main(String[] args) { getDemo(); }
public static void getDemo() { String str = "ming tian jiu yao fang jia le , da jia.";
String reg = "\\b[a-z]{4}\\b";// '\b'是边界判断
//将正则封装成对象。 Pattern p = Pattern.compile(reg);//注意大小写。
//让正在对象和要作用的字符串相关联。获取匹配器对象。 Matcher m = p.matcher(str);//正则对象和字符串相关联。
//其实String类中的matches方法就是用Pattern和Matcher对象完成的。 //只不过被String的方法封装后,用来较为简单,但功能简单。 //System.out.println(m.matches());
//boolean b = m.find();//将规则作用到字符串上,并进行符合规则的子串查找。 //System.out.println(b); //System.out.println(m.group());//用于获取匹配后的结果。
while (m.find()) { System.out.println(m.group()); System.out.println(m.start()+"..."+m.end()); } } } |
X* 没有或多次
到底用四种功能中的哪一个呢?或者哪几个?思考方式。[day25-06]
思考方式:
1、如果只想知道该字符串是对是错,可以使用匹配。
2、想要将已有的字符串变成另一个字符串,可以替换。
3、想要按照指定的方式,将字符串变成多个字符串,切割。获取规则意外的子串。
4、想要拿到符合需求的字符串子串,获取。获取符合规则的子串。
常见的QQ号码校验程序:
public static void checkQQ() { String qq = "12345678"; //步骤分析: //第一位:只能是1-9; //第二位: 只要是数字就行; //第三位:出现的次数是4-14次;大括号中间为逗号 //String regex = "[1-9][0-9]{4,14}"; String regex = "[1-9]\\d{4,14}";
boolean flag = qq.matches(regex); if(flag) System.out.println(qq+"....is ok"); else System.out.println(qq+"....不合法"); } |
切割中用点(.)切割时:使用(\\.)去切割
按多个空格( +)切割时:使用(_+)去切割
/* 匹配手机号: 手机号段都只有13xxx,15xxx,18xxx */
public static void checkTel() { String tel = "1399999999"; String telReg = "1[358]\\d{9}"; System.out.println(tel.matches(telReg)); } |
常用的去叠词替换:
replaceAllDemo(str1,"(.)\\1+","&");//ert&ui&pu&bn //相当于去除重复的。ertyuiopuvbn。前一个规则中的第一个组。 replaceAllDemo(str1,"(.)\\1+","$1");//通过$符号获取前面一个组。前提是有一个组。 |
单词边界判断:‘\b’à "\\b[a-z]{4}\\b"
邮箱地址校验:
/* 需求:对邮件地址进行校验。
*/ public static void checkMail() { String mail = "abc12@sina.com";
String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//或者{1,3}一次到三次//较为精确的匹配。 reg= "\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配
//mail.indexOf("@")!=-1;
System.out.println(mail.matches(reg)); } |
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima