------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

正则表达式:

概念:用于操作字符串的符合一定规则的表达式

特点:用于一些特定的符号来表示一些代码的操作,可以调用底层的代码对字符串进行操作。简化了代码的书写。

正则表达式利弊:

好处:正则的出现,对字符串的复杂操作变得更为简单。

弊端:符号的出现虽然简化了书写,但是却降低了阅读性。

常用符号:

构造 匹配
 
字符
x 字符 x
\\ 反斜线字符
\0n 带有八进制值 0 的字符 n (0 <= n <= 7)
\0nn 带有八进制值 0 的字符 nn (0 <= n <= 7)
\0mnn 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7)
\xhh 带有十六进制值 0x 的字符 hh
\uhhhh 带有十六进制值 0x 的字符 hhhh
\t 制表符 ('\u0009')
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
\f 换页符 ('\u000C')
\a 报警 (bell) 符 ('\u0007')
\e 转义符 ('\u001B')
\cx 对应于 x 的控制符






字符类
[abc] ab 或 c(简单类)
[^abc] 任何字符,除了 ab 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p[a-dm-p](并集)
[a-z&&[def]] de 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p[a-lq-z](减去)





预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]









边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾




Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
Reluctant 数量词
X?? X,一次或一次也没有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n 次
X{n,}? X,至少 n 次
X{n,m}? X,至少 n 次,但是不超过 m 次

常见操作:

到底用四种功能中的哪一个呢?或者哪几个呢?

思路方式:

1,如果只想知道该字符是否对是错,使用匹配。

2,想要将已有的字符串变成另一个字符串,替换。

3,想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。

4,想要拿到符合需求的字符串子串,获取。获取符合规则的子串。

匹配:其实用的就是String类中的matches方法。

  1. /**
  2. * 匹配:
  3. * 手机号段只有 13xxx 15xxx 18xxxx
  4. *
  5. */
  6. public class CheckDemo
  7. {
  8. public static void main(String[] args)
  9. {
  10. String tel = "15394485938";
  11. String telReg = "1[358]\\d{9}";
  12. System.out.println(tel.matches(telReg));
  13. }
  14. }

切割:其实用的就是String类中的split方法。

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

按叠词完成切割:为了让规则被重用,可将规则封装成一个组,用()完成。组的出现都有编号,从1开始。想要使用已有的组可通过\n(n就是组的编号)的形式来获取。

组:

用小括号标示,每定义一个小括号,就是一个组,而且有自动编号,从1开始。

只要使用组,对应的数字就是使用该组的内容。别忘了,数组要加\\。

(aaa(wwww(ccc))(eee))技巧,从左括号开始数即可。有几个左括号就是几组。

对于组中所匹配的字符,可以用$n来获取。$在正则中表示行的结尾,所以出现在正则中不能用来表示组,一般用于替换中。

替换:其实用的就是String类中的replaceAll();

  1. /**
  2. * 替换演示:
  3. *
  4. */
  5. public class ReDemo
  6. {
  7. public static void main(String[] args)
  8. {
  9. String str = "我我...我我...我要..要要...要要...进进进....进进...黑黑黑...黑马..马.马马...马...马";
  10.  
  11. str = str.replaceAll("\\.+","");
  12. System.out.println(str);
  13.  
  14. str = str.replaceAll("(.)\\1+","$1");
  15.  
  16. System.out.println(str);
  17. }
  18. }

获取:

先要将正则表达式编译成正则对象。使用的是Pattern中静态方法 compile(regex);

通过Pattern对象获取Matcher对象。

Pattern用于描述正则表达式,可以对正则表达式进行解析。

而将规则操作字符串,需要从新封装到匹配器对象Matcher中。然后使用Matcher对象的方法来操作字符串。

如何获取匹配器对象:通过Pattern对象中的matcher方法。该方法可以正则规则和字符串想关联。并返回匹配器对象。

使用Matcher对象中的方法即可对字符串进行各种正则操作。

  1. /**
  2. * 获取:将字符串中的符合规则的子串取出。
  3. *
  4. */
  5. import java.util.regex.*;
  6.  
  7. class RegexDemo2
  8. {
  9. public static void main(String[] args)
  10. {
  11. getDemo();
  12. }
  13. public static void getDemo()
  14. {
  15. String str = "ming tian jiu yao fang jia le ,da jia。";
  16. System.out.println(str);
  17. String reg = "\\b[a-z]{4}\\b";
  18.  
  19. //将规则封装成对象。
  20. Pattern p = Pattern.compile(reg);
  21.  
  22. //让正则对象和要作用的字符串相关联。获取匹配器对象。
  23. Matcher m = p.matcher(str);
  24.  
  25. while(m.find())
  26. {
  27. System.out.println(m.group());
  28. System.out.println(m.start()+"...."+m.end());
  29. }
  30. }
  31. }

网络爬虫(蜘蛛)

实际上是一个功能,用于搜集网络上的指定信息

可用于收集邮箱,qq号等之类的信息。

如通过关键字搜索blog,实际就是使用的“蜘蛛”,通过查找关键字获取相关的blog

  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import java.net.URL;
  4. import java.net.URLConnection;
  5. import java.util.regex.Matcher;
  6. import java.util.regex.Pattern;
  7.  
  8. public class GetWebMail
  9. {
  10. //获取网页中mail
  11. public static void main (String[] args) throws Exception
  12. {
  13. //封装网页地址
  14. URL url=new URL("http://tieba.baidu.com/p/1390896758");
  15. //连接服务器
  16. URLConnection conn=url.openConnection();
  17. //带缓冲区的网页读取流
  18. BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
  19. String line=null;
  20. //定义匹配邮件地址的正则表达式
  21. String regex="\\w+@\\w+(\\.\\w+)+";
  22. Pattern p=Pattern.compile(regex);//封装正则表达式
  23. //读取网页数据
  24. while ((line=br.readLine())!=null)
  25. {
  26. //正则关联数据
  27. Matcher m=p.matcher(line);
  28. //寻找匹配邮箱
  29. while (m.find())
  30. {
  31. System.out.println(m.group());//输出匹配邮箱
  32. }
  33. }
  34. }
  35. }
  1. import java.io.BufferedReader;
  2. import java.io.File;
  3. import java.io.FileReader;
  4. import java.util.regex.Matcher;
  5. import java.util.regex.Pattern;
  6.  
  7. public class GetFileMail
  8. {
  9. //获取文件中mail
  10. public static void main (String[] args) throws Exception
  11. {
  12. //将文件封装成对象
  13. File file=new File("E:\\mail.txt");
  14. //创建带缓冲区的读取流
  15. BufferedReader br=new BufferedReader(new FileReader(file));
  16. String line=null;
  17.  
  18. //定义正则表达式
  19. String regex="\\w+@[a-zA-Z]+(\\.[a-zA-z]+)+";
  20. //创建Pattern对象,封装正则表达式
  21. Pattern p=Pattern.compile(regex);
  22.  
  23. //读取文件中数据
  24. while ((line=br.readLine())!=null)
  25. {
  26. //关流字符串
  27. Matcher m=p.matcher(line);
  28. while (m.find())//寻找匹配的字符串
  29. {
  30. System.out.println(m.group());//输出匹配的字符串
  31. }
  32. }
  33. }
  34. }

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

黑马程序员——JAVA基础之正则表达式,网络爬虫的更多相关文章

  1. 黑马程序员Java基础班+就业班课程笔记全发布(持续更新)

    正在黑马学习,整理了一些课程知识点和比较重要的内容分享给大家,也是给自己拓宽一些视野,仅供大家交流学习,大家有什么更好的内容可以发给我 ,现有黑马教程2000G  QQ 1481135711 这是我总 ...

  2. 黑马程序员----java基础笔记中(毕向东)

    <p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...

  3. 黑马程序员----java基础笔记上(毕向东)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 笔记一共记录了毕向东的java基础的25天课程,分上.中.下 本片为上篇,涵盖前10天课程 1. ...

  4. 黑马程序员——JAVA基础之泛型和通配符

    ------- android培训.java培训.期待与您交流! ---------- 泛型:            JDK1.5版本以后出现新特性.用于解决安全问题,是一个类型安全机制. 泛型好处: ...

  5. 黑马程序员——JAVA基础之简述面向对象,类,变量,匿名对象

    ------- android培训.java培训.期待与您交流! ---------- 面向对象: 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程 强调的是功能行为 面向对象 将 ...

  6. 黑马程序员——JAVA基础之语法、命名规则

    ------- android培训.java培训.期待与您交流! ---------- 1.java语言组成:关键字,标识符,注释,常量和变量,运算符,语句,函数,数组. 2.java关键字:被Jav ...

  7. 黑马程序员——JAVA基础之网络编程

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 网络编程 网络模型:OSI参考模型和TCP/IP参考模型 网络通讯三要素: IP地址:InetA ...

  8. 黑马程序员——JAVA基础之简述设计模式

    ------- android培训.java培训.期待与您交流! ---------- 设计模式(Design Patterns) 设计模式(Design pattern)是一套被反复使用.多数人知晓 ...

  9. 黑马程序员----java基础笔记下(毕向东)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 目录--- 21.字符编码 22.javaswig 事件 23.socket 网络通讯 24.网 ...

随机推荐

  1. python成长之路【第二篇】:列表和元组

    1.数据结构数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在Python中,最基本的数据结构是序列(sequence) ...

  2. hdu2297Run(凸包的巧妙应用)

    链接 很巧妙的一道题,参考 把距离和速度分别作为x和y坐标,以斜率代表追赶速率,简直炫酷~ 具体看上面的博客,画的很清楚,就不再抄写一遍了. #include <iostream> #in ...

  3. Android 利用xUtils框架实现对sqllite的增删改查

    首先下载xUtils,下载地址:https://github.com/wyouflf/xUtils  把下载好的文件压缩,把里面的jar包拷进项目中如图所示: 这里新建一个User类进行测试增删改查 ...

  4. (八)open函数的flag详解

    3.1.4.open函数的flag详解13.1.4.1.读写权限:O_RDONLY O_WRONLY O_RDWR(1)linux中文件有读写权限,我们在open打开文件时也可以附带一定的权限说明(譬 ...

  5. CSS 3 颜色表示法

    1,Color Name:red    优点:方便记忆  缺点:数量少不支持透明度 2,HEX方式:#FFFFFF    优点:颜色种类多   缺点:换算复杂需要借助工具 3,RGB方式:rgb(25 ...

  6. oracle 语句 字段拼接(可换行)

    eg: update tablename t set t.nr = '"+NR1+"' || '<br/>' ||'"+NR2+"' where 条 ...

  7. 数据库 基础篇2(mysql)

    2.1MySQL入门 1)到mysql官网下载. 2)安装mysql软件 3)使用 验证是否成功 打开cmd  -> 输入 mysql -u root -p  回车   -> 输入密码   ...

  8. sql server 自增长id 允许插入显示值

    --允许插入显示插入主键id的值SET IDENTITY_INSERT [T0002_SType] ON 执行insert插入语句------------------ --关闭 插入显示值SET ID ...

  9. bugfree安装

    1.下载xampp文件:xampp-linux-x64-5.5.30-3-installer.run 2.安装此文件,用root账号安装,安装命令:./xampp-linux-x64-5.5.30-3 ...

  10. String类和StringBuffer类的方法

    一.String类的方法 public char charAt(int index)          返回字符串index个字符 public int length()         返回字符串长 ...