黑马程序员:正则表达式介绍:QQ匹配、E-mail提取应用

来源:互联网 发布:淘宝售后客服怎么应聘 编辑:程序博客网 时间:2024/05/01 03:23

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

正则表达式:符合一定规则的表达式

作用:专门用于操作字符串
特点:用一些特点的符号来表示一些代码操作,简化书写
好处:可以简化对字符串的复杂操作
弊端:符号定义越多正则越长,阅读性越差

具体操作功能:
1.匹配 String类中的matches(regex)方法,用规则匹配整个字符串,只要有一处不符合规则就匹配结束,返回false
2.切割:String split(regex)
3.替换:String replaceAll(regex, newString);
4.获取:将字符串中符合规则的子串取出
获取的操作步骤:String str = "ming tian jiu yao hui jia le!";
1.将正则表达式封装成对象 Pattern p = Pattern.compile(regex);
2.让正则对象和要操作的字符串相关联 Matcher m = p.matcher(str);
3.关联后,获取正则匹配引擎 Matcher
4.通过引擎对符号规则的子串进行操作,比如取出 boolean b = m.find();
String result = m.group();


获取-代码演示:
String str = "ming tian jiu yao hui jia le!";
String reg = "\\b[a-z]{3}\\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()); //返回匹配结果在字符串中的位置,包含头不包含尾
}
结果:jiu yao hui jia
注意:
1.同一个匹配器用的是相同的指针,若前面有匹配,那指针就会跟着匹配移动,下次匹配的时候就从上次匹配结束的位置开始
2.find()匹配的是子串,而matches()匹配的是整个字符串

示例:
对QQ号码进行校验
要求5~15位,不能以0开头,只能是数字
String qq="23412312";
String regex = "[1-9][0-9](4-14)"; //第一位1-9之间的数字,第二位0-9之间的数字,数字范围4-14个之间
boolean flag = qq.matches(regex);
if(flag)
System.out.println("QQ号正确");
else
System.out.println("QQ号错误");

str = "zhang.li.wang";
str.split("\\.");  这里要按.切割,但是.是regex中的特殊字符,代表任意字符,所以在regex中要转义一下,就成了\.,但是这是regex中代表的.,在字符串中还需要被转义,所以就是\\.
再如:
str = "c:\\abc\\a.txt";
str.split("\\\\");

str = "sdfwwejkwerrrjwe"; 按叠词切割(该字符串中的叠词有ww,rrr)
String[] s = str.split("(.)\\1+"); // .代表任意字符 (.)代表第一个组,\1代表第一个组的结果(所以在字符串中应该输入\\1) +代表出现一次或者多次

(X) X,作为捕获组
\n 任何匹配的 nth 捕获组

在表达式 ((A)(B(C))) 中,存在四个这样的组: 
1     ((A)(B(C)))
2     (A)
3     (B(C))
4     (C)

看有多少组就看左括号,要看是第几组,还是看左括号

str = "werw1234823423wewkj234232nnj";
str = str.replaceAll("\\d{5,}","#");//将连续5个数字的字符串换成#

str = "sdfwwejkwerrrjwe";
str = str.replaceAll("(.)\\1+","$1"); //$1代表前一个规则中的第一个组获取的值 ,即该规则为将ww替换为w,rrr替换为r

到底用四个功能中的哪一个或者多个呢?
思路方式:
1.如果指向知道该字符串是否对错,使用匹配
2.如果要将已有的字符串编程另一个字符串,使用替换
3.想要按照自定的方式将字符串变成多个字符串,切割,获取规则以外的子串。
4,想要拿到符合需求的字符串子串,获取。获取符合规则的子串

练习题:
需求:将写列字符串转成:我要学编程
str = "我我我...要要..要..学学..学学学..编程";

//将已有字符串编程另一个字符串,使用替换功能
1.可以先将.去掉
2.在将多个重复的内容变成单个内容。

str = str.replaceAll("\\.","");
str = str.replaceAll("(.)\\1+","$1");
System.out.println(str);

对邮件地址进行校验:
String mail = "abc123@sina.com";
String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";较为精确的匹配。
reg = "\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配

练习题:
将mail.txt中的E-mail提出出来存放到另外一个文本中
/* * 练习题: * 将mail.txt中的E-mail提出出来存放到另外一个文本中 */import java.io.*;import java.util.regex.*;class CatchEmail{public static void main(String[] args) throws Exception{matchesEmail();}public static void matchesEmail() throws Exception{BufferedReader bfr = new BufferedReader(new FileReader("mail.txt"));BufferedWriter bfw = new BufferedWriter(new FileWriter("newmail.txt"));String reg = "\\w+@\\w+(\\.\\w+)+";Pattern p = Pattern.compile(reg);String line = null;while((line=bfr.readLine())!=null){Matcher m = p.matcher(line);while(m.find()){bfw.write(m.group());bfw.newLine();}}bfw.close();bfr.close();}}

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
原创粉丝点击