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

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! -------------------------

一、Java正则表达式
   正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的一个或多个字符串
   先来了解一下正则表达式的部分构造摘要:

构造

匹配

字符

x

字符 x

\\

反斜线字符

\t

制表符 ('\u0009')

\n

新行(换行)符 ('\u000A')

\r

回车符 ('\u000D')

\f

换页符 ('\u000C')

\a

报警 (bell) 符 ('\u0007')

\e

转义符 ('\u001B')

字符类

[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](减去)

预定义字符类

.

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

\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 次

 

 

Possessive 数量词

X?+

X,一次或一次也没有

X*+

X,零次或多次

X++

X,一次或多次

X{n}+

X,恰好 n 次

X{n,}+

X,至少 n 次

X{n,m}+

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

 

 

Logical 运算符

XY

X 后跟 Y

X|Y

X 或 Y

(X)

X,作为捕获组

正则表达式对字符串的常见操作:
1、 匹配 (其实使用的就是String类中的matches方法)
  1. //匹配手机号码是否正确。    
  2.     String str = "15158041079";  
  3.     boolean b = str.matches("1[358]\\d{9}");//1[358][0-9]{9}  
  4.     System.out.println(b);  
//匹配手机号码是否正确。 
	String str = "15158041079";
	boolean b = str.matches("1[358]\\d{9}");//1[358][0-9]{9}
	System.out.println(b);
2、切割 (主要用到String类的split方法)
2.1  根据一个或多个点来拆分字符串
  1. public static void main(String[] args) {  
  2.         String str = "zhangsan...lisi..wangwu";  
  3.         // 根据一个或多个点来拆分字符串   
  4.         String[] names = str.split("\\.+");  
  5.         for (String name : names) {  
  6.             System.out.println(name);  
  7.         }  
  8.     }  
public static void main(String[] args) {
		String str = "zhangsan...lisi..wangwu";
		// 根据一个或多个点来拆分字符串
		String[] names = str.split("\\.+");
		for (String name : names) {
			System.out.println(name);
		}
	}
输出结果:
zhangsan
lisi
wangwu
2.2 删除叠词
  1. public static void main(String[] args) {  
  2.         String str = "zhangsan666lisitttwangwu";  
  3.         // "."代表任意字符,(.)把它封装为组,编号为1...n,调用它直接用编号,  
  4.         //1由于代 表的是正常的 1,用\1将它转义为组编号,由于是在字符串中,再用\\1来转义  
  5.         String[] names = str.split("(.)\\1+");  
  6.         for (String name : names) {  
  7.             System.out.println(name);  
  8.         }  
  9.     }  
public static void main(String[] args) {
		String str = "zhangsan666lisitttwangwu";
		// "."代表任意字符,(.)把它封装为组,编号为1...n,调用它直接用编号,
		//1由于代 表的是正常的 1,用\1将它转义为组编号,由于是在字符串中,再用\\1来转义
		String[] names = str.split("(.)\\1+");
		for (String name : names) {
			System.out.println(name);
		}
	}
输出结果:
zhangsan
lisi
wangwu
3、替换(使用到了String类中的replaceAll()方法
  1. public static void main(String[] args) {  
  2.         String str = "zhangsanttttlisimmmwangwu";  
  3.         str = str.replaceAll("(.)\\1+""$1");// $符号调用了前面参数中的第1组  
  4.         System.out.println(str);  
  5.         String tel = "15158041079";  
  6.         // 括号表示 组 被替换的部分 $n 表示 第n组的内容   
  7.         tel = tel.replaceAll("(\\d{4})\\d{3}(\\d{4})""$1****$2");  
  8.         System.out.println(tel);// 1382****1111  
  9.     }  
public static void main(String[] args) {
		String str = "zhangsanttttlisimmmwangwu";
		str = str.replaceAll("(.)\\1+", "$1");// $符号调用了前面参数中的第1组
		System.out.println(str);
		String tel = "15158041079";
		// 括号表示 组 被替换的部分 $n 表示 第n组的内容
		tel = tel.replaceAll("(\\d{4})\\d{3}(\\d{4})", "$1****$2");
		System.out.println(tel);// 1382****1111
	}
输出结果:
zhangsantlisimwangwu
1382****1111
4、获取
  1. public static void main(String[] args) {  
  2.   
  3.         String str = "da asdf sdf,sdkfh,sdk sdhh jtt!";  
  4.         String regex = "\\b[a-z]{3}\\b";  
  5.         // 1,将正则规则进行对象的封装   
  6.         Pattern p = Pattern.compile(regex);  
  7.         // 2, 通过正则对象的matcher方法字符串相关联。获取要对字符串操作的匹配器对象Matcher 。  
  8.         Matcher m = p.matcher(str);  
  9.         // 使用Matcher对象的方法对字符串进行操作。  
  10.         // 既然要获取三个字母组成的单词   
  11.         // 查找 find();   
  12.         System.out.println(str);  
  13.         while (m.find()) {  
  14.             System.out.println(m.group());// 获取匹配的子序列  
  15.         }  
  16.     }  
public static void main(String[] args) {

		String str = "da asdf sdf,sdkfh,sdk sdhh jtt!";
		String regex = "\\b[a-z]{3}\\b";
		// 1,将正则规则进行对象的封装
		Pattern p = Pattern.compile(regex);
		// 2, 通过正则对象的matcher方法字符串相关联。获取要对字符串操作的匹配器对象Matcher 。
		Matcher m = p.matcher(str);
		// 使用Matcher对象的方法对字符串进行操作。
		// 既然要获取三个字母组成的单词
		// 查找 find();
		System.out.println(str);
		while (m.find()) {
			System.out.println(m.group());// 获取匹配的子序列
		}
	}
输出结果:
da asdf sdf,sdkfh,sdk sdhh jtt!
sdf
sdk
jtt
正则表达式练习:

网页爬虫:

  1. /* 
  2.      * 网页爬虫:其实就一个程序用于在互联网中获取符合指定规则的数据。 爬取邮箱地址。 
  3.      */  
  4.     public static void main(String[] args) throws IOException {  
  5.         List<String> list = getMails();  
  6.         for (String mail : list) {  
  7.             System.out.println(mail);  
  8.         }  
  9.     }  
  10.   
  11.     public static List<String> getMails() throws IOException {  
  12.         // 1,读取源文件。   
  13.         BufferedReader bufr = new BufferedReader(  
  14.                 new FileReader("D:\\mail.html"));  
  15.         // 2,对读取的数据进行规则的匹配。从中获取符合规则的数据.  
  16.         String mail_regex = "\\w+@\\w+(\\.\\w+)+";  
  17.         List<String> list = new ArrayList<String>();  
  18.         Pattern p = Pattern.compile(mail_regex);  
  19.         String line = null;  
  20.         while ((line = bufr.readLine()) != null) {  
  21.             Matcher m = p.matcher(line);  
  22.             while (m.find()) {  
  23.                 // 3,将符合规则的数据存储到集合中。  
  24.                 list.add(m.group());  
  25.             }  
  26.         }  
  27.         bufr.close();  
  28.         return list;  
  29.     }  

    ---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! -------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript正则表达式Java正则表达式在语法上有一些差异,但是它们的基本概念和用法是相似的。下面是将JavaScript正则表达式转换为Java正则表达式的一些常见规则: 1. 语法差异: - JavaScript正则表达式使用斜杠(/)作为定界符,而Java正则表达式使用双引号(")作为定界符。 - JavaScript正则表达式中的特殊字符需要进行转义,而Java正则表达式中的特殊字符不需要转义。 2. 字符类: - JavaScript正则表达式中的字符类使用方括号([])表示,而Java正则表达式中使用方括号([])或者Unicode转义(\p{...})表示。 - JavaScript正则表达式中的字符类可以使用连字符(-)表示范围,而Java正则表达式中需要使用Unicode转义(\uXXXX)表示范围。 3. 量词: - JavaScript正则表达式中的量词使用花括号({})表示,而Java正则表达式中使用花括号({})或者问号(?)表示。 - JavaScript正则表达式中的贪婪量词默认是贪婪模式,而Java正则表达式中的贪婪量词需要在后面添加问号(?)来表示非贪婪模式。 4. 边界匹配: - JavaScript正则表达式中的边界匹配使用插入符号(^)和美元符号($)表示,而Java正则表达式中使用\A和\Z表示。 5. 其他差异: - JavaScript正则表达式中的捕获组使用圆括号(())表示,而Java正则表达式中使用圆括号(())或者方括号([])表示。 - JavaScript正则表达式中的反向引用使用反斜杠加数字(\1、\2等)表示,而Java正则表达式中使用美元符号加数字($1、$2等)表示。 以上是一些常见的JavaScript正则表达式转换为Java正则表达式的规则。具体转换时,还需要根据具体的正则表达式进行适当的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值