黑马程序员——Java基础—正则表达式

来源:互联网 发布:ios10gamecenter数据 编辑:程序博客网 时间:2024/05/18 00:58


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);elseSystem.out.println("请输入正确的数字");*/}elseSystem.out.println("不能以'0'开头");}elseSystem.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-->zString 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  MatcherString 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());}}}}



0 0
原创粉丝点击