黑马程序员————正则复习

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------



正则

 

特点:正则表达式用于操作字符串数据。

弊端:虽然简化了,但是阅读性差。


示例:

 

需求:定义一个功能对QQ号进行校验。长度5~15,只能是数字,0不能开头。

public class RegexDemo{

public static void main(String[] args){

String qq = "123456701";

 

正则表达式常用构造摘要

 

[abc] a、b 或 c(简单类)

[^abc] 任何字符,除了 a、b 或 c(否定)

[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)

[a-d[m-p]] 并集

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

[a-z&&[^bc]]a 到 z,除了 b 和 c

[a-z&&[^m-p]]a 到 z,除了 m 到 p

 

 

预定义字符类

 

任何字符(与行结束符可能匹配也可能不匹配) 引用时切记加\\

\d 数字:[0-9]

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

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

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

\w 单词字符 [a-zA-Z0-9]   常用语邮箱校验

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


Greedy 数量词


X? X,0次或1次

X* X,0次或多次

X+ X,一次或多次

X{n} X,恰好 n 次

X{n,}  X,至少 n 次

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

 

边界匹配器

 

^ 行的开头

$ 行的结尾

\b 单词边界

\B 非单词边界

\A 输入的开头

\G 上一个匹配的结尾

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

\z 输入的结尾


示例:

 

 

public class RegexDemo {

 

public static void main(String[] args){

String str = "aoob";

String reg = "ao?b";

boolean b = str.matches(reg);

System.out.println(str + ":" + b);


reg = "ao+b";

b = str.matches(reg);

System.out.println(str + ":" + b);


str = "ab";

reg = "ao+b";

b = str.matches(reg);

System.out.println(str + ":" + b);


str = "ab";

reg = "ao*b";

b = str.matches(reg);

System.out.println(str + ":" + b);


str = "aooooooob";

reg = "ao{4,}b";

b = str.matches(reg);

System.out.println(str + ":" + b);


reg = "ao{4,6}b";

b = str.matches(reg);

System.out.println(str + ":" + b);

}

}

 运行结果:

 

 



 

正则表达式常见功能:匹配、切割、替换、获取

 

正则表达式对字符串的常见操作

  1. 匹配

其实使用的就是String类中的matches方法,返回值为布尔型。

手机号的正则表达式,String regex = "1[358]\\d{9}"

  2. 切割

其实使用的就是String类中的split方法。

“ +”切割空格

\\.”切割.

“\\\\”切割\\

“(.)\\1+”表示任意一种元素重复出现的字符串

小插曲:用()把操作内容括起来表示一组,组的出现都有编号,从1开始,组通过后面加\n(n代表组的编号)的形式获取。

在表达式 ((A)(B(C))) 中,存在四个这样的组:

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

* 2 \A

* 3 (B(C))

* 4 (C)

 

3. 替换

其实使用的就是String类中的replaceAll方法。

String str = str.replaceAll“\\d{5,}”,”#”)

叠词替换:String str = str.replaceAll“(.)\\1+”,”#”)表示叠词被一个#取代

String str = str.replaceAll“(.)\\1+”,”$”)表示叠词变单词

 

4. 获取

操作步骤:

1、将正则规则进行对象的封装。Pattern compile str 

Pattern p = Pattern.compile(String str);

2通过正则对象获取匹配器对象Matcher,通过正则对象regex的matcher方法字符串相关联

                    Matcher m = p.matcher(regex);

3使用Matcher对象的方法对字符串进行操作 查找:find(),group();matches()

public static void functionDemo(){

String str = "da jia hao,ming tian bu fang jia";

String regex = "\\b[a-z]{3}\\b";    // \\b表示单词边界

Pattern p = Pattern.compile(regex); //1. 将正则封装成对象

Matcher m = p.matcher(str); //2. 通过正则对象获取匹配器对象

while(m.find()){ //3使用Matcher对象的方法对字符串进行操作。

System.out.println(m.group()); //获取匹配的子序列

System.out.println(m.start() + ":" + m.end());//结果为指针所在位置

 

练习1:对ip地址排序

 

import java.util.TreeSet;

import java.io.PrintStream;

public class RegexTest{

public static void main(String[] args){

  test();

}

 

 

public static void test(){

String ip_str = "192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55";

// 为了让ip可以按照字符串顺序比较,只要让ip的每一段的位数相同。

//所以,补零,按照每一位所需最多0进行补充,每一段都加两个0。

ip_str = ip_str.replaceAll("(\\d+)","00$1");

//然后每一段保留数字3位。

ip_str = ip_str.replaceAll("0*(\\d{3})","$1");

System.out.println(ip_str);

//将ip地址切出。

String[] ips = ip_str.split(" +");

TreeSet<String> ts = new TreeSet<String>(); 

for(String ip : ips){

ts.add(ip);

}


for(String ip : ts){

System.out.println(ip.replaceAll("0*(\\d+)","$1"));

}

}

 

 

运行结果:



练习2:邮箱校验

 

import java.util.TreeSet;

import java.io.PrintStream;

public class RegexTest{

public static void main(String[] args){

test();

}

}

 

public static void test(){

String mail = "abc1@sina.com";

String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{1,3})+";

//regex = “\\w+@\\w+(\\.\\w+)+”;相对不精确的匹配

boolean b = mail.matches(regex);

System.out.println(mail + ":" + b);

}

}

 

 

 

运行结果:

 


 

 

 

练习3:爬虫

 

 

import java.util.*;

import java.io.*;

import java.net.URL;

/*

* 网页爬虫:其实就是一个程序用于在互联网中获取符合指定规则的数据。

* 爬取邮箱地址。

*/

public class RegexTest{

public static void main(String[] args) throws IOException {

List<String> list = getMails();

for(String mail : list){

System.out.println(mail);

}

}

public static List<String> getMails() throws IOException {

//1. 读取源文件。

URL url = new URL(“http://192.168.1.254:0808/myweb/mail.html”);

URLConnection conn = url.openConnection();

BufferedReader bufr = new BufferedReader(new InputStreamReader(conn.getInputStream()));

//2. 对读取的数据进行规则的匹配。从中获取符合规则的数据。

String mail_regex = "\\w+@\\w+(\\.\\w+)+";

List<String> list = new ArrayList<String>();

Pattern p = Pattern.compile(mail_regex);

//3. 将符合规则的数据存储到集合中。

String line = null;

while((line = bufr.readLine()) != null){

Matcher m = p.matcher(line);

while(m.find()){

list.add(m.group());

}

}

return list; 

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值