黑马程序员--- 学习笔记(第二十五天)

来源:互联网 发布:js 刷新当前界面 编辑:程序博客网 时间:2024/04/29 17:40
 —————————— ASP.Net+Android+IOS开发.Net培训、期待与您交流!——————————
正则表达式
符合一定规则的表达式
作用:用于专门操作字符串
特点:用一下特定的符号来表示一些代码操作,简化书写,其实就是学习一些
特殊符号的使用
好处:可以简化字符串的复杂操作
弊端:符号定义越多,正则越长,阅读越差


1.匹配


matches(regex);//用规则匹配,不符合返回false


. 任何字符
\d [0-9]数字
\D 非[0-9]数字
\s 空白字符
\S 非空白字符
\w [0-9a-Z_]
\W 非[0-9a-Z_]


? 一次或一次都没有
* 0次或多次
+ 一次或多次
{n} 刚好n次
{n,} 至少n次
{n,m}至少n次最多m次


/*匹配匹配qq号码 不能以0头 最少5位 最多11位匹配手机号码 1开头 第二位必须是358其一, 后面9个任意数字 */class Demo1 {public static void main(String[] args) {String qq="849126553";String phone="13168138876";System.out.println(method1(qq));System.out.println(method2(phone));}//匹配QQ号public static boolean method1(String qq){String regex="[1-9]\\d{4,9}";return qq.matches(regex);}//匹配手机号码public static boolean method2(String phone){String regex="1[359]\\d{9}";return phone.matches(regex);}}



2.切割


split(regex,子串);


组的概念:
可以将规则封装一个组,用()完成,该组都有编号,从1开始,.想要使用组通过\n的形式来获取


/*切割wo  diu  ni*/class Demo2 {public static void main(String[] args) {/*String str="wo  diu  ni";String regex=" +";String []strs=str.split(regex);for (String s : strs ){System.out.println(s);} */ //按照叠词切割String str="arkk.ty.qqqqujo";//String regex="(.)\\1+";//.是正则匹配符  //String regex="(.)\\1+";String regex="\\.";//要转义String []strs=str.split(regex);for (String s : strs ){System.out.println(s);}}}



3.替换


replaceAll(regex,字串);  //替换  


/*替换replaceAll();*/class Demo3 {public static void main(String[] args) {String str="fdafdddweoooifdlll";String regex="(.)\\1+";//将叠词替换成 "n"//System.out.println(str.replaceAll(regex,"n"));//将叠词替换成本身//$n代表使用前一个规则的n组System.out.println(str.replaceAll(regex,"n"));}}



4.获取
将字符串中符合规则的字串取出


操作步骤:
1.将正则表达式,封装成对象
2.将正则对象和要操作的字符串相关联
3.关联后,获取正则匹配的引擎
4.通过引擎对符合的规则的字串进行操作,比如取出


Pattern类的
static Pattern compile(String regex) 
          将给定的正则表达式编译到模式中。
Matcher matcher(CharSequence input) 
          创建匹配给定输入与此模式的匹配器。 


Matcher类


matches();//其实String类的matches方法,用的就是Pattern的Matcher
对象来完成,只不过被String的方法封装后,用起来简单,但是功能单一


boolean find() 
          尝试查找与该模式匹配的输入序列的下一个子序列。 
String group() 
          返回由以前匹配操作所匹配的输入子序列。 
 boolean matches() 
          尝试将整个区域与模式匹配。 
 int start() 
          返回以前匹配的初始索引。 
 String toString() 
          返回匹配器的字符串表示形式。 
 int end() 
          返回最后匹配字符之后的偏移量。 


边界匹配器:
^ 行口头
$ 行结尾
\b 单词边界
\A 输入开头
\Z 输入结尾


/*获取PatternMatcher*/import java.util.regex.Pattern;import java.util.regex.Matcher;class Demo4 {public static void main(String[] args) {String str="min tian jiu xue wan le";String regex="\\b[a-z]{3}\\b";Pattern p=Pattern.compile(regex);//将正则封装成对象Matcher m=p.matcher(str);//绑定要进行匹配的字符串//这里调用会影响后面的取出   因为使用都是同一个指针//System.out.println(m.matches());//取出现3次的小写英文字母while(m.find()){//寻找  System.out.println(m.start()); //起始  System.out.println(m.group()); //获取匹配的结果  System.out.println(m.end()); //结束}}}



注意: 同一匹配器使用的是同一个指针
   
到底用四种功能哪一种呢?
思路方式:
1.如果只想知道该字符串是否对错,用匹配
2.想要将已有的字串变成一个字符串,替换
3.想要按照自己的方式将字符串变成多个字符串,切割,获取规则以为的字串
4.想要拿到符合需求的字符串字符,获取符合规则的字串


/*  对邮箱验证*/class Demo5 {public static void main(String[] args) {//对邮箱验证String mail="849126553@qq.com";String re="\\w+@\\w+(\\.\\w+)+";System.out.println(mail.matches(re));}}

/*需求:将下列字符串转成:我要学编程.*/class Demo6 {public static void main(String[] args) {String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程";String re="\\.+";str=str.replaceAll(re,"");//结果System.out.println(str.replaceAll("(.)\\1+","$1"));}}

/*192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30将ip地址进行地址段顺序的排序。*/import java.util.*;class Demo7 {public static void main(String[] args) {String str="192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";str=str.replaceAll("(\\d+)","00$1");str=str.replaceAll("0*(\\d{3})","$1");String []strs=str.split(" ");TreeSet<String> ts=new TreeSet<String>();for (String s : strs ){ts.add(s);}for (String s : ts){System.out.println(s.replaceAll("0*(\\d+)","$1"));}}}



网页爬虫


/*网页爬虫这里以文件为例 */import java.util.regex.*;import java.io.*;class Demo8 {public static void main(String[] args)throws Exception { BufferedReader br=new BufferedReader(new FileReader("mail.txt")); String line=null; Pattern p=Pattern.compile("\\w+@\\w+(\\.\\w+)+"); //匹配获取文本中所有的mail地址 while((line=br.readLine())!=null){ Matcher m=p.matcher(line);while(m.find()){System.out.println(m.group());} } br.close();}}

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

0 0
原创粉丝点击