黑马程序员——Java基础—正则表达式
2015-01-23 16:26
411 查看
Java基础之正则表达式
正则表达式:可理解为符合一定规则的表达式。作用:专门用于操作字符串。
特点:用一些特定的符号来表示一些代码操作,可以简化书写。因此,学习正则表达式就是学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作。弊端:符号定义越多,正则越长,阅读性越差。
具体操作功能:
1.匹配:String的matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
代码示例:
class RegexDemo { public static void main(String[] args) { checkTel(); } /* 练习:对手机号码进行校验。 规定手机号码只有:13xxx , 15xxx , 18xxx 这三个号段的。 长度是11位的。 */ public static void checkTel() { String tel = "15588644488"; String regex = "1[358]\\d{9}"; System.out.println(tel.matches(regex)); } /* 对QQ号码进行校验 要求:5~15 0不能开头,只能是数字 */ public static void checkQQ_reg() { String qq = "12002531"; String regex = "[1-9]\\d{4,14}"; //定义正则表达式。 System.out.println(qq.matches(regex)); } //下面的方式也可以完成,但代码量过多,不够简化。学习了正则之后就变得简单多了。 public static void checkQQ() { String qq = "65655454"; int len = qq.length(); System.out.println(len); if(len>=5 && len<=15) { if(!qq.startsWith("0")) { 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("请输入正确的数字"); */ } else System.out.println("不能以'0'开头"); } else System.out.println("长度错误"); } }
2.切割:String split();
3.替换:String replaceAll(regex,str):使用给定的字符串替换此字符串中所有匹配正则表达式的子字符串。
如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。
为了可以让规则的结果被重用,可以将规则封装成一个组,用()表示。组的出现都有编号,从1开始编号。想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取。 在正则里 .代表任意字符。
在替换当中,可以用"$"来获取到规则里的组。str.replaceAll("(.)\\1+","$1"); "$1"是代表前面规则里的第1个组。 \b 单词边界 。
切割代码示例:
class RegexDemo1 { public static void main(String[] args) { splitDemo("zhangsan lisi wangwu"," +"); //X+ X,一次或多次 splitDemo("zhangsan.lisi.wangwu","\\."); //在正则里 .代表任意字符。 splitDemo("d:\\java2014\\day21","\\\\"); //在java中"\"会将后面的字符转义,要成对的出现"\\" /* 需求:按照叠词完成切割。 为了可以让规则的结果被重用,可以将规则封装成一个组,用()表示。 组的出现都有编号,从1开始编号。想要使用已有的组可以通过 \n(n就是组的编号)的 形式来获取。 */ splitDemo("dfwwokadddlkqqqqqrw","(.)\\1+"); } public static void splitDemo(String str,String regex) { String[] arr = str.split(regex); System.out.println(arr.length); for(String s : arr) { System.out.println(s); } } }替换与组的代码演示:
<span style="white-space:pre"> </span>public static void replaceAllDemo1() { //需求:将字符串中出现的叠词替换成单个的"&"。 String str = "dfwwokadddlkqqqqqrw"; String regex = "(.)\\1+"; String newStr = str.replaceAll(regex,"&"); System.out.println(newStr); } public static void replaceAllDemo2() { //需求:将字符串中重叠的字母替换成单个字母。 zzzz-->z String str = "dfwwokadddlkqqqqqrw"; String regex = "(.)\\1+"; String newStr = str.replaceAll(regex,"$1"); System.out.println(newStr); }
正则表达式的第4个功能就是获取:将字符串中符合规则的子串取出。
操作步骤:
1.通过Pattern类的compile方法将正则表达式封装成对象。示例:Pattern p = Pattern.compile(regex);
2.让正则对象和要操作的字符串相关联。获取匹配器对象。 示例:Matcher m = p.matcher(String);
3.将规则作用到字符串上,并进行符合规则的子串查找。示例:boolean b = m.find(); m.group():用于获取匹配后结果。代码示例如下:
import java.util.regex.*; class RegexDemo3 { public static void main(String[] args) { getDemo(); } public static void getDemo() { String str = "jidu yu zhao hui shi jida de aomi"; String regex = "\\b[a-z]{4}\\b"; //1.将正则表达式封装成对象。 Pattern p = Pattern.compile(regex); //2.让正则对象和要操作的字符串相关联。获取匹配器对象。 Matcher m = p.matcher(str); while(m.find()) //3.进行符合规则的子串查找。 { //4.获取匹配后结果。 System.out.println(m.group()); } } }
正则表达式学习了四种具体的操作功能,在实际的应用中,到底用四种功能中的哪一个呢?或者哪几个呢?
思考方式:
1,如果只想知道该字符串是对是错,使用匹配。
2,想要将已有的字符串变成另一个字符串,使用替换。
3,想要按照指定的方式将字符串变成多个字符串,使用切割。获取规则以外的子串。
4,想要拿到符合规则的字符串子串,使用获取。获取符合规则的子串。
/* 网页爬虫(蜘蛛)。 练习:1.获取指定文档中的邮箱地址。2.获取网页中的邮箱地址。 */ import java.io.*; import java.util.regex.*; import java.net.*; class RegexTest1 { public static void main(String[] args) throws IOException { getMail(); } public static void getMail_1() throws IOException { String regex = "[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+"; Pattern p = Pattern.compile(regex); URL url = new URL("http:\\127.0.0.1:10010"); URLConnection conn = url.openConnection(); BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream())); for(String line=null; (line=bufIn.readLine())!=null; ) { Matcher m = p.matcher(line); while(m.find()) System.out.println(m.group()); } } public static void getMail() throws IOException { //需求:获取指定文档中的邮箱地址,使用正则的获取功能。Pattern Matcher String regex = "[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+"; Pattern p = Pattern.compile(regex); BufferedReader bufr = new BufferedReader(new FileReader("mail.txt")); for(String line=null; (line=bufr.readLine())!=null; ) { Matcher m = p.matcher(line); while(m.find()) { System.out.println(m.group()); } } } }
相关文章推荐
- 黑马程序员——java基础--正则表达式
- 黑马程序员————Java基础日常笔记---反射与正则表达式
- 黑马程序员——java基础——正则表达式
- 黑马程序员——Java基础之反射,正则表达式
- 黑马程序员—Java基础—正则表达式
- 黑马程序员——java基础——正则表达式
- 黑马程序员:Java基础总结----正则表达式
- 黑马程序员——Java基础---正则表达式
- 黑马程序员—————Java基础--------正则表达式
- 黑马程序员—Java基础—正则表达式
- 黑马程序员——Java基础---正则表达式
- 黑马程序员——Java基础---正则表达式
- 黑马程序员——java语言基础——正则表达式
- 黑马程序员——Java基础---String、StringBuffer和正则表达式
- 黑马程序员:Java基础总结----正则表达式
- 黑马程序员_java基础视频第18天_与系统交互的类及IO流
- 【黑马程序员】java编程基础,面向对象
- 黑马程序员-------学习日记Java基础 第二天
- 黑马程序员_java基础视频第23天_ java网络编程
- 黑马程序员_java基础视频第21天_JavaIO续集3