黑马程序员----正则表达式
2015-08-15 11:25
525 查看
——- android培训、java培训、期待与您交流! ———-
对字符窜操作既简单有有效的方法就是正则表达式。
弊端:符号定义越多,正则表达式越长,阅读性越差;
用一些特定的符号来表示一些代码的操作,这样就简化书写。所以学习正则表达式就是在学习一些特殊符号的使用。
正则表达式具体操作功能:
1.匹配:String matches();
用规则匹配整个字符串,只要有一个不符合规则就结束,返回false。
在正则表达式当中,反斜杠都是成对出现的,\\d:第一个反斜杠把第二个反斜杠转义成普通的反斜杠,\d是一个组合,代表的是数字[0-9];
2.切割:String split();
.代表任意字符,如果一定要用.切割,就转义一下:String regex="\\.";
按照叠词切割;叠词就是后一个和前一个是一致的。当要对一个规则的结果进行重用的时候,就封装成组,用(),而且从1开始自动编号,这个组中的结果就可以被再次使用,用\n捕获组的概念,其中的n为组的编号。
(()(())(())):有几组就看有几个左括号,并且第一个左括号为第一组,依次类推。
3.替换:String replaceAll();
$1:指前面那个符号里的第一个组。前提是一定要有组。如果不写,默认整个字符串就是一个组,为第0组,替换不了。
4.获取:
按照规则取字符串子串;
操作步骤:
1.将正则表达书封装成对象;
2.让正则对象和要操作的字符串相关联;
3.关联后,获取正则匹配引擎;
4.通过引擎对符合规则的子串进行操作,比如取出。
单词边界:\b;
非单词边界:\B;
同一个匹配器用的是同一个索引位。
需求:
1.将下列字符串转成:“我要学编程”
String str="我我...我我...我要..要要...学学学....学学...编编编..编程...程程...程.程.程";
到底用四种功能中的哪一个或者哪几个呢?
思路:
如果只想知道该字符串是对是错可以使用匹配;
如果想要将已有的字符串变成另一个字符串可以使用替换;
如果想要按照自定义的方式将字符串变成多个字符串可以使用切割(获取规则以外的子串)
如果想要拿到符合需求的字符串子串可以使用获取(获取符合规则的子串)
2.将IP地址进行地址段顺序的排序:
192.168.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30
还按照字符串自然顺序,只要让它们每一段都是3位即可。
步骤:
1.按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。
2.将每一段只保留3位,这样,所有的IP地址都是每一段3位;
3.对邮件地址进行校验:
checkMail();
正则表达式
符合一定规则的表达式,用于专门操作字符串。对字符窜操作既简单有有效的方法就是正则表达式。
弊端:符号定义越多,正则表达式越长,阅读性越差;
用一些特定的符号来表示一些代码的操作,这样就简化书写。所以学习正则表达式就是在学习一些特殊符号的使用。
正则表达式具体操作功能:
1.匹配:String matches();
用规则匹配整个字符串,只要有一个不符合规则就结束,返回false。
在正则表达式当中,反斜杠都是成对出现的,\\d:第一个反斜杠把第二个反斜杠转义成普通的反斜杠,\d是一个组合,代表的是数字[0-9];
2.切割:String split();
.代表任意字符,如果一定要用.切割,就转义一下:String regex="\\.";
按照叠词切割;叠词就是后一个和前一个是一致的。当要对一个规则的结果进行重用的时候,就封装成组,用(),而且从1开始自动编号,这个组中的结果就可以被再次使用,用\n捕获组的概念,其中的n为组的编号。
(()(())(())):有几组就看有几个左括号,并且第一个左括号为第一组,依次类推。
3.替换:String replaceAll();
$1:指前面那个符号里的第一个组。前提是一定要有组。如果不写,默认整个字符串就是一个组,为第0组,替换不了。
4.获取:
按照规则取字符串子串;
操作步骤:
1.将正则表达书封装成对象;
2.让正则对象和要操作的字符串相关联;
3.关联后,获取正则匹配引擎;
4.通过引擎对符合规则的子串进行操作,比如取出。
单词边界:\b;
非单词边界:\B;
同一个匹配器用的是同一个索引位。
public class Regex_0 { public static void sop() { System.out.println(); } public static void main(String[] args) { //匹配: //checkQQ(); //checkqq(); //demo(); //checkTel(); //切割: splitDemo("zjamgdan,lisi, wangwu",",");//按照逗号切割; sop(); splitDemo("zjamgdan lisi wangwu"," +");//按照一个或者多个空格切割; sop(); splitDemo("zjamgdan.lisi.wangwu","\\.");//.代表任意字符,如果一定要用.切割,就转义一下:String regex="\\."; sop(); splitDemo("c:\\abc\\a.tet","\\\\");//按照两个反斜杠切割; sop(); splitDemo("abccdefgghijkllmnoopqqqqistuvwwxyz","(.)\\1+");//按照叠词切割;叠词就是后一个和前一个是一致的。 //当要对一个规则的结果进行重用的时候,就封装成组,用(),而且有自动编号,从1开始,这个组中的结果就可以被再次使用,用\n表示捕获组的概念,其中的n为组的编号。 //(()(())(())):有几组就看有几个左括号,并且第一个左括号为第一组,依次类推。 sop(); //替换: replaceAllDemo("wer123tryufh45631232hfbvngj78","\\d{5,}","#");//将字符串中的数字替换成#; replaceAllDemo("wer123tryyufh45563123332hfbvnngj78","(.)\\1+","#");//将叠词替换成#; replaceAllDemo("wer123tryyufh45563123332hfbvnngj78","(.)\\1+","$1");//将重叠的字母替换成单个字母;$是一个特殊符号,获取组; sop(); //获取: get(); } //------------------------------------------------------------------------ //正则表达式的切割功能演示:替换 public static void replaceAllDemo(String str,String regex,String newstr) { str=str.replaceAll(regex, newstr); System.out.println(str); } //------------------------------------------------------------------------ //正则表达式的切割功能演示: 获取 public static void get() { String str="ming tian jiu yao fang jia le !da jia hao kai xin."; //获取由3个字母组成的的单词: String regex="\\b[a-z]{3}\\b";//单词边界:\b; //str="123456789"; //String regex="[1-9]\\d{4,14}"; //将规则封装成对象: Pattern p=Pattern.compile(regex); //让正则对象与要作用的字符串相关联: Matcher m=p.matcher(str); //System.out.println(m.matches()); //其实String类中的matches方法,用的就是Pattern和Matcher对象来完成,只不过被String的方法封装后,用起来较为简单,但是功能却单一。 //boolean b=m.find();//将规则作用到字符串 上,并进行符合规则的子串查找。 //System.out.println(b); //System.out.println(m.group());//group():获取匹配后的结果。 //迭代器: while(m.find()) { System.out.println(m.group()); System.out.println(m.start()+"....."+m.end()); } } //------------------------------------------------------------------------ //正则表达式的切割功能演示: public static void splitDemo(String str,String regex) { String[] arr=str.split(regex); for(String s:arr)//高级for循环; { System.out.println(s); } } //------------------------------------------------------------------------ //正则表达式的匹配功能演示: //验证电话号码:13*,15*,18*。 public static void checkTel() { String tel="17658941423"; String regex="1[358]\\d{9}"; System.out.println(tel.matches(regex)); } //--------------------------------------- public static void demo() { String str="a"; String regex="[acd]";//字符串中的第一个字符只能是a或者c或者d,而且这个字符串只能有一个字符; boolean b=str.matches(regex); System.out.println(b); } //---------------------------------------- public static void checkqq() { //看字符串匹配,如果匹配就返回true,不匹配就返回false; String qq="023456"; String regex="[1-9][0-9]{4,14}"; boolean flag=qq.matches(regex); if(flag) { System.out.println(" QQ number:"+qq+" is ture"); } else { System.out.println(" QQ number is false"); } } //-------------------------------------------- //需求:对QQ号码进行校验:5-15位,0不能开头,只能是数字。 public static void checkQQ() { String qq="234aa56789"; int len=qq.length(); if(len>5&&len<15) { if(!qq.startsWith("0"))//Integer.parseInt("12a");NumberFormatException { //让Java帮我们校验: try { long l=Long.parseLong(qq); System.out.println("QQ号码:"+qq); } catch(NumberFormatException e) { System.out.println("出现非法字符"); } /* //判断字符串中的每一位是不是数字:把字符窜变成数组; char[] arr=qq.toCharArray(); boolean flag=true;//定义标记; for(int x=0;x<arr.length;x++) { if(!(arr[x]>='0'&&arr[x]<='9')) { flag=false; break; } } if(flag) { System.out.println("QQ号码:"+qq); } else { System.out.println("QQ号码有非法字符"); }*/ } else { System.out.println("QQ号码不能以数字0开头"); } } else { System.out.println("长度错误"); } //这种方式使用了String类中的方法,进行组合完成了需求,但是代码过于复杂。 } }//class
需求:
1.将下列字符串转成:“我要学编程”
String str="我我...我我...我要..要要...学学学....学学...编编编..编程...程程...程.程.程";
到底用四种功能中的哪一个或者哪几个呢?
思路:
如果只想知道该字符串是对是错可以使用匹配;
如果想要将已有的字符串变成另一个字符串可以使用替换;
如果想要按照自定义的方式将字符串变成多个字符串可以使用切割(获取规则以外的子串)
如果想要拿到符合需求的字符串子串可以使用获取(获取符合规则的子串)
2.将IP地址进行地址段顺序的排序:
192.168.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30
还按照字符串自然顺序,只要让它们每一段都是3位即可。
步骤:
1.按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。
2.将每一段只保留3位,这样,所有的IP地址都是每一段3位;
3.对邮件地址进行校验:
checkMail();
public class RegexPractice_0 { public static void main(String[] args) { test_0(); System.out.println(); test_1(); System.out.println(); checkMail(); } public static void test_0() { String str="我我...我我...我要..要要...学学学....学学...编编编..编程...程程...程.程.程"; //替换:将已有字符串变成另一个字符串 //1.先将.去掉;2.再将多个重复的内容变成单个内容。 str=str.replaceAll("\\.", "");//将.替换成空的字符串; System.out.println(str); str=str.replaceAll("(.)\\1+", "$1");//去除叠词; System.out.println(str); } public static void test_1() { String ip="192.168.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30"; ip=ip.replaceAll("(\\d+)","00$1"); System.out.println(ip); //只保留3位; ip=ip.replaceAll("0*(\\d{3})","$1"); System.out.println(ip); System.out.println(); //切割: String[] arr=ip.split(" +"); //排序: TreeSet<String> ts=new TreeSet<String>(); for(String s:arr) { ts.add(s); } for(String s:ts) { System.out.println(s.replaceAll("0*(\\d+)","$1"));//去掉开头的0; } } public static void checkMail() { String mail="123466shd@sina.com.cn.cn.cn.cn"; String regex="[a-zA-Z0-9_]{6,12}@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";//封装组,较为精确的匹配 regex="\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配; //mail.indexOf("@")!=-1; System.out.println(mail.matches(regex)); } }//class
网页爬虫:蜘蛛
public class WebCrawler { public static void main(String[] args) throws IOException { getMails(); } public static void getMails() throws IOException { //获取指定文档中的邮件地址,是用获取功能。Pattern Matcher BufferedReader bufr=new BufferedReader(new FileReader("mail.txt"));//系统找不到文件; String line=null; String mailregex="\\w+@\\w+(\\.\\w+)+"; Pattern p=Pattern.compile(mailregex); while((line=bufr.readLine())!=null) { Matcher m=p.matcher(line); while(m.find()) { System.out.println(m.group()); } } } public static void getMails_Web() throws Exception { URL url=new URL("http://192.168.1.254:8080/myweb/mail.html"); URLConnection conn=url.openConnection(); BufferedReader bufIn=new BufferedReader(new InputStreamReader(conn.getInputStream())); String line=null; String mailregex="\\w+@\\w+(\\.\\w+)+"; Pattern p=Pattern.compile(mailregex); while((line=bufIn.readLine())!=null) { Matcher m=p.matcher(line); while(m.find()) { System.out.println(m.group()); } } } }
相关文章推荐
- msql 正则表达式
- 正则表达式
- Mootools 1.2教程 正则表达式
- 批处理FINDSTR正则表达式用法实例分析
- vbs正则表达式代码
- php中看实例学正则表达式
- PHP正则表达式之定界符和原子介绍
- PHP下常用正则表达式整理
- 批处理 正则表达式(findstr) 整理
- JavaScript类型系统之正则表达式
- javascript中的正则表达式使用指南
- 学习正则帮手笨狼正则练习器
- java正则表达式应用的实例代码
- ruby 正则表达式 教程
- PHP中的正则表达式函数介绍
- javascript replace方法与正则表达式
- PowerShell中使用正则表达式筛选数组实例
- 关于Perl里面正则表达式规范
- PERL 正则表达式详细说明
- JavaScript通过正则表达式实现表单验证电话号码