java正则表达式
2015-12-03 12:39
666 查看
/* 正则表达式:符合一定规则的表达式。 作用:用于专门操作字符串。 特点:用一些特定的符号来表示一些代码操作,这样就简化了书写。 所以学习正则表达式,就是在学习一些特殊符号的使用。 好处:可以简化对字符串的复杂操作。 弊端:符号定义越多,正则越长,阅读性越差。 java中\\d转义--\\成对出现 [358]或者3或者5或者8 \d 数字 \w [a-zA-Z0-9] X?一次货一次也没有 X*零次或多次 X+一次或多次 X{n,}至少n次 X{n,m}至少n次,但不超过m次 具体操作功能: 1.匹配:boolean matches(String regex);用规则匹配整个字符串,只要有一处不符合规则,就匹配结束。 2.切割:String[] split(String regex);//把规则外的取出 3.替换:String replaceAll(String regex,String newStr); 4.获取:将字符串中符合规则的子串取出。 操作步骤: 1.将正则表达式封装成对象。 2.让正则对象和要操作的字符串相关联。 3.关联后,获取正则匹配引擎。 4.通过引擎对符合规则的子串进行操作,比如取出。 */ import java.util.*; class RegexDemo{ public static void main(String[] args) { checkQQByString("123456"); ckeckQQByRegex("sfa44"); ckeckTel("15865712812"); splitDemo(); replaceAllDemo(); } /* 对qq号码进行校验 要求:5~15位 0不能开头 只能是数字 这种方式,使用了String类中的方法,进行了组合完成了需求。但代码过于复杂。 */ public static void checkQQByString(String qq){ int length = qq.length(); if(length>=5 &&length<=15){ if(!qq.startsWith("0")){ try{ long l = Long.parseLong(qq); System.out.println("qq:"+l); }catch (NumberFormatException e){ System.out.println("出现非法字符!"); } /*---自己校验太麻烦 char[] arr = qq.toCharArray(); boolean flag = true; for(int i=0;i<arr.length;i++) { if(!(arr[i]>='0'&&arr[i]<='9')) { flag = false; break; } } if(flag) System.out.println("qq:"+qq); else System.out.println("出现非法字符!"); */ }else{ System.out.println("不能以0开头!") } }else{ System.out.println("长度错误!") } } //通过正则表达式qq public static void checkQQByRegex(String qq){ String regex = "[1-9]\\d{4,14}";//第一位为1~9,其余为0~9,要重复(4-14)次。 boolean flag = qq.matches(regex); if(flag) System.out.println(qq+"合法"); else System.out.println(qq+"不合法"); } /* 匹配手机号 手机号段只有13xxx 15xxx 18xxx */ public static void checkTel(String tel){ String regex = "[1][358]\\d{9}"; System.out.println(tel.matches(regex)); } //split public static void splitDemo(){ //String str = "zhangsan lis wangwu"; //String regex = " +";//空格出现1次或多次 //String str = "zhagnsan.lisi.wangwu"; //String regex = "\\."; //String str = "C:\\adb\\a.txt"; //String regex = "\\\\"; String str = "erkktyqquizzo";//按叠词切 String regex ="(.)\\1"; // (.)\\n+ //为了可以让规则的结果被重用, //可以将规则封装成一个组。用()完成。组的出现都有编号。 //从1开始。想要使用已有的组,可以通过\n(n就是组的编号)的形式来获取。 String[] arr = str.split(regex); for(String s : arr) System.out.println(s); } public static void replaceAllDemo(){ //String str = "wer134653213ty1321354uioas1313513f";//将字符串中的数字替换成#号 //String newStr = "#"; //String regex = "\\d{5,}"; //String str = "erkktyqquizzzzzzo";//将叠词替换成&。 //String newStr ="#"; //String regex = "(.)\\1+"; String str = "erkktyqquizzzzzzo";//将叠词替换成单个字符 zzzzz->z。 String newStr ="$1"; String regex = "(.)\\1+"; str = str.replaceAll(regex,newStr); System.out.println(str); } //获取演示 public static void getDemo(){ String str = "ming tian jiu yao fang jia le,da jia";//取出三个字符组成的字符串 String regex = "\\b{a-z}{3}\\b"; //将正则封装成对象。 Pattern p = Pattern.compile(regex); //让正则对象和要作用的字符串相关联。 Matcher m = p.matcher(str); //将规则作用到字符串上,并进行符合规则的子串查找 //boolean flag = m.find(); //获取匹配后结果。 //System.out.println(m.group()); while(m.find()){ System.out.println(m.group()); System.out.println(m.start()"......"+m.end());//获取字符串的索引位置 } } } /*------------------------------------------------------------------------------*/ /* 练习: 将下列字符串转成:我要学编程。 */ import java.util.*; class RegexText{ public static void main(String[] args){ test_1(); test_2(); checkMail(); } /* 练习: 将下列字符串转成:我要学编程。 到底用四种功能中的哪个?或者哪几个呢? 思路方式: 1.如果只想知道该字符是否对错,使用匹配。 2.想要将已有的字符串变成另一个字符串,使用替换。 3.想要按照指定的方式将字符串变成多个字符串。使用切割。获取规则以外的子串。 4.想要拿到符合需求的字符串子串,使用获取。获取符合规则的子串。 */ public static void test_1(){ String str = "我我...我我...我要..要..要要..学学学...学学..编编编...编编..程..程...程...程程"; /* 将已有的字符串变成另一个字符串。使用 替换功能。 1.可以先将.去掉。 2.再将多个重复的内容变成单个内容。 */ str = str.replaceAll("\\.+",""); str = str.replaceAll("(.)\\1+","$1"); System.out.println(str); } /* 192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30 将ip地址进行地址段顺序的排序。 还按照字符串自然顺序排序,只要让他们每一段都是3位即可。 1.按照每一段需要的最多的9进行补齐。那么美一段就会至少保证有3位。 2.将每一段只保留3位。这样,所有的ip地址都是每一段3位。 */ public static void test_2(){ String ip = "192.68.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); ip = ip.replaceAll("0*(\\d{3})","$1"); //System.out.println(ip); 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")); } /*需求:对邮件地址进行校验。*/ public static void checkMail(){ String mail = "abc12@sina.com"; String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配 System.out.println(mail.matches(regex)); } } /* 网页爬虫(蜘蛛) */ import java.io.*; import java.util.*; import java.net.*; class GetMailsDemo{ public static void main(String[] args){ getMailsFromFile();//从文件中获取 getMailsFromWeb();//从网页中获取 } /* 获取指定文档中的邮件地址。 使用获取功能。Pattern Matcher */ public static void getMailsFromFile()throws Exception{ BufferedReader br = new BufferedReader(new FileReader(mail.txt)); String line = null; String mailReg = "\\w+@+(\\.\\w+)+"; Pattern p = Pattern.compile(mailReg); while((line = br.readLine())!=null){ Matcher m = p.matcher(line); while(m.find()){ System.out.println(m.group()); } } } public static void getMailsFromWeb()throws Exception{ URL url = new URL("http://192.168.1.254.80/myweb/mail.html"); URLConnection conn = url.openConnection(); BufferedReader brIn = new BufferedReader( new InputStreamReader(conn.getInputStream())); String line = null; String mailReg = "\\w+@+(\\.\\w+)+"; Pattern p = Pattern.compile(mailReg); while((line = brIn.readLine())!=null){ Matcher m = p.matcher(line); while(m.find()){ System.out.println(m.group()); } } } }
相关文章推荐
- 百度地图相关(1)百度地图的首次默认加载
- Eclipse不给提示no default proposals
- spring之BeanFactoryAware接口
- springMVC第一课:配置
- Eclipse的Android xml预览布局时,超出屏幕怎么看效果
- 狗屎的Java规范
- 个人学习java的真实经验!
- Java并发编程:Lock
- java:从消息机制谈到观察者模式
- 定时任务中的 Timer的schedule和scheduleAtFixedRate方法的区别
- RxJava的简单学习(学习自扔物线)
- Java并发编程:volatile关键字解析
- javaday2-java语言基础
- Java反射机制详解
- java中String的常用方法
- java基础学习——循环结构(while,do-while,for)笔试题
- java必学必会之GUI编程
- java中常用的字符串的截取方法
- java中的内存解析(1)
- 【转】java.lang.Exception: Socket bind failed: [730048]问题解决办法