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

王朝学院·作者佚名  2016-05-29
窄屏简体版  字體: 小  |  中  |  大  |  超大  

黑马程序员——【java基础】——正则表达式---------- android培训、java培训、期待与您交流! ----------

一、概述

1、 概念:符合一定规则的表达式。

2、 作用:用于专门操作字符串。

3、 特点:用一些特定的符号来表示一些代码操作,这样可以简化书写。

4、 好处:可以简化对字符串的复杂操作。

5、 弊端:符合定义越多,正则越长,阅读性越差。

二、常见规则

1、字符类

[abc]:表示a、b或 c

[^abc]:表示任何字符,除了 a、b或 c

[a-zA-Z]:表示a到 z或 A 到 Z

[a-d[m-p]]:表示a到 d或 m 到 p([a-dm-p](并集))

[a-z&&[def]]:d、e或 f(交集)

[a-z&&[^bc]]:表示a到 z,除了 b和 c:[ad-z](减去)

[a-z&&[^m-p]]:表示a到 z,而非 m到 p:[a-lq-z](减去)

2、预定义字符

. : 任何字符(与行结束符可能匹配也可能不匹配)

\d:数字:[0-9]

\D:非数字: [^0-9]

\s:空白字符:[ \t\n\x0B\f\r]

\S:非空白字符:[^\s]

\w:单词字符:[a-zA-Z_0-9]

\W:非单词字符:[^\w]

3、边界匹配符

^:行的开头

$ :行的结尾

\b:单词边界

\B:非单词边界

\A:输入的开头

\G:上一个匹配的结尾

\Z:输入的结尾,仅用于最后的结束符(如果有的话)

\z:输入的结尾

4、Greedy数量词

X? :X出现一次或一次也没有

X*:X出现零次或多次

X+: X出现一次或多次

X{n}:X恰好 n次

X{n,}:X至少 n次

X{n,m}X:至少 n次,但是不超过 m 次

5、组和捕获

捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C)))中,存在四个这样的组:

1 ((A)(B(C)))

2 \A

3 (B(C))

4 (C)

组零始终代表整个表达式,在替换中常用$匹配组的内容。

三、正则表达式常见功能

正则表达式常见功能,主要有四种:匹配、切割、替换和获取

1、匹配

String类中的boolean matches(String regex)方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。

2、切割

String类中的String[] split(String regex)方法。

3、替换

String replaceAll(String regex , String replacement)方法。示例:

String str = “zhangsantttxiaoqiangmmmzhan”

str = str.replaceAll(“(.)\\” , );

4、获取

获取:是将字符串中符合规则的子串取出。

操作步骤:

(1)将正则表达式封装成对象。Pattern p = Pattern.compile(regex);

(2)让正则对象和要操作的字符串相关联。Matcher m = p.matcher(str);

(3)关联后,获取正则匹配引擎。

(4)通过引擎对符合规则的子串进行操作,例如查找、取出。m.find()、m.group();

四、正则表达式应用练习

练习1:字符串转换

1 /* 需求:将下列字符串转成:我要学编程 2 "我我...我..我要...要...要要....学学....学学学......编编编...程...程程...." 3 4 思路: 5 将已有字符串变成另一个字符串。使用替换功能。 6 1、可以先将 . 去掉。 7 2、再将多个重复的内容变成单个内容。 8 */ 9 class ReplaceTest{10 public static void main(String[] args){11 String s = "我我...我..我要...要...要要....学学....学学学......编编编...程...程程....";12 System.out.PRintln(s);13 14 String regex = "\\.+";//先将 . 去掉15 s = s.replaceAll(regex,"");//去掉 .16 System.out.println(s);17 18 regex = "(.)\\1+";//将重复的内容变成单个内容19 s = s.replaceAll(regex,"$1");//去重20 System.out.println(s);21 }22 }

练习2:将ip地址进行地址段顺序的排序。

1 /* 需求:将ip地址进行地址段顺序的排序。 2 192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.301 3 4 思路: 5 还按照字符串自然顺序,只要让他们每一段都是3位即可。 6 1、按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。 7 2、将每一段只保留3位。这样,所有的ip地址都是每一段3位。 8 */ 9 import java.util.*;10 class IPSortTest{11 public static void main(String[] args){12 String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.301";13 System.out.println(ip);14 15 String regex = "(\\d+)";16 ip = ip.replaceAll(regex,"00$1");//保证每段至少都有三位-------------17 System.out.println(ip);18 19 regex = "0*(\\d{3})";20 ip = ip.replaceAll(regex,"$1");//每段只保留三位21 System.out.println(ip);22 23 regex = " ";24 String[] arr = ip.split(regex);//按照空格切25 26 //定义一个TreeSet集合,利用元素自然排序27 TreeSet<String > ts = new TreeSet<String>();28 for (String str : arr ){29 ts.add(str);//添加30 }31 regex = "0*(\\d)";//把每段前面多余的0替换掉32 for (String s : ts){33 System.out.println(s.replaceAll(regex,"$1"));//把每段前面多余的0替换掉34 }35 }36 }

练习3:邮件地址校验

1 //需求:对邮件地址进行校验。 2 class CheckMail{ 3 public static void main(String[] args){ 4 String mail = "123a809bc@sina.com.cn"; 5 String regex = "\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";//较为精确 6 regex = "\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。 7 boolean b = mail.matches(regex); 8 System.out.println(b); 9 }10 }

练习4:网络爬虫

/* 网络爬虫实际上是一个功能,用于搜集网络上的指定信息需求:可用于收集邮箱,QQ号等之类的信息。*/import java.net.*;import java.util.regex.*;import java.io.*;class Spider{ public static void main(String[] args)throws Exception{ //getFileMail(); getWebMail(); } //获取网页中mail public static void getWebMail()throws Exception{ //封装网页地址 URL url = new URL("http://tieba.baidu.com/p/1390896758"); //连接服务器 URLConnection conn = url.openConnection(); //带缓冲区的网页读取流 BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = null; //定义匹配邮件地址的正则表达式 String regex = "\\w+@\\w+(\\.\\w+)+"; Pattern p = Pattern.compile(regex);//封装正则表达式 //读取网页数据 while ((line = br.readLine())! = null){ //正则关联数据 Matcher m = p.matcher(line); //寻找匹配邮箱 while (m.find()){ System.out.println(m.group());//输出匹配邮箱 } } } //获取指定文档中的邮件地址。使用获取功能。Pattern Matcher public static void getFileMail()throws Exception{ //将文件封装成对象 File file = new File("E:\\Java Study\\Practice\\day25\\mail.txt"); //创建带缓冲区的读取流 BufferedReader br = new BufferedReader(new FileReader(file)); String line = null; //定义正则表达式 String regex = "\\w+@[a-zA-Z]+(\\.[a-zA-z]+)+"; //创建Pattern对象,封装正则表达式 Pattern p = Pattern.compile(regex); //读取文件中数据 while ((line = br.readLine())! = null){ //关流字符串 Matcher m = p.matcher(line); while (m.find())//寻找匹配的字符串{ System.out.println(m.group());//输出匹配的字符串 } } }}

---------- android培训、java培训、期待与您交流! ----------

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航