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

本文深入探讨了正则表达式在Java编程中的应用,详细讲解了匹配、切割、替换等功能,并提供了常见正则表达式示例,如匹配中文、邮箱地址、网址等,帮助开发者更高效地处理字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



正则表达式


正则表达式:符合一定规则的表达式

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

特点:用于一些特定的符号来表示一些代码操作。这样就简化代码书写

所以,学习正则表达式就是学习一些特殊符号的操作和使用

好处:可以简化对字符串的操作

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

 

具体操作功能

1,匹配:String matches方法。用规则匹配整个字符串,只要有一处不符合规则,就结束匹配,返回false

String qq="123456";
		String regex="[1-9][0-9]{4,14}";
	boolean b = qq.matches(regex);//将正则和字符串关联对字符串进行匹配。

2,切割:String split()方法

public static void splitDemo(){
		/*String str="zhangsan  lisi  wangwu";
		String reg=" +";//按照多个空格来进行切割
		*/
		/*String str="zhangsan.lisi.wangwu";
		String reg="\\.";//按照.来进行切割
		*/
		/*String str="c:\\abc\\a.txt";
		String reg=	"\\\\";//按照\\来切割
		*/
		String str="asdkkfhqqijqriqjjok";
		String reg="(.)\\1+";//按照叠词完成切割
		/*
		 * 按照叠词切割,为了可以让规则的结果被重用,可以将规则封装成一个组
		 * 用()完成。组的出现都有编号,从1开始,想要使用已有的组可以通过\n
		 * (n就是组的编号)的形式来获取
		 */
		
		String[] arr =str.split(reg);
		System.out.println(arr.length);
		for(String s:arr){
			System.out.println(s);
		}


3,替换:String  replaceAll()

public class RegexDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str ="wne1380000008hyfq123494988jd";
		replaceAllDemo(str,"\\d{5,}","#");//将字符串中连续5位以上的数字替换成#
		
		String str1="qwekkkuyfafffojnkoooobj";
		replaceAllDemo(str1,"(.)\\1+","&");//将叠词替换成&
		replaceAllDemo(str1,"(.)\\1+","$1");//将重叠的字母替换成单个字母,如:kkkk--->k
		
	}
	
	public static void replaceAllDemo(String str,String reg,String newStr){
		str=str.replaceAll(reg, newStr);
		System.out.println(str);
}
}

4,获取

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

2),通过Pattern对象获取Matcher对象。

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

而将规则操作字符串,需要从新封装到匹配器对象Matcher中。

然后使用Matcher对象的方法来操作字符串。

如何获取匹配器对象呢?

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

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

package regular.expression;
import java.util.regex.*;

public class RegexDemo2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		getDemo();
	}
	
	public static void getDemo(){
		String str="ming tian fang jia,da jia hao hao wan";
		String reg="\\b[a-z]{3}\\b";
		
		//将规则封装成对象
		Pattern p= Pattern.compile(reg);
		
		//让正则对象和要作用的字符串相关联,获取匹配器对象
		Matcher m= p.matcher(str);
		
		//System.out.println(m.matches());//其实String类中的matches方法用的就是Pattern
		//和Matcher对象来完成的,只不过被String的方法封装后,用起来较简单,但功能单一
		
		//boolean b=m.find();//将规则作用到字符串上,并进行符合规则的子串查找
		//System.out.println(b);
		//System.out.println(m.group());//用于获取匹配后结果
		while(m.find()){
			System.out.println(m.group());
			System.out.println(m.start()+"-----"+m.end());//打印单词开始和结束的脚标
		}
	}

}



正则表达式的构造摘要 

构造

匹配

 

 

字符

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]

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]

 

 

POSIX 字符类(仅 US-ASCII)

\p{Lower}

小写字母字符:[a-z]

\p{Upper}

大写字母字符:[A-Z]

\p{ASCII}

所有 ASCII:[\x00-\x7F]

\p{Alpha}

字母字符:[\p{Lower}\p{Upper}]

\p{Digit}

十进制数字:[0-9]

\p{Alnum}

字母数字字符:[\p{Alpha}\p{Digit}]

\p{Punct}

标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

\p{Graph}

可见字符:[\p{Alnum}\p{Punct}]

\p{Print}

可打印字符:[\p{Graph}\x20]

\p{Blank}

空格或制表符:[ \t]

\p{Cntrl}

控制字符:[\x00-\x1F\x7F]

\p{XDigit}

十六进制数字:[0-9a-fA-F]

\p{Space}

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

 

 

java.lang.Character 类(简单的 java 字符类型

\p{javaLowerCase}

等效于 java.lang.Character.isLowerCase()

\p{javaUpperCase}

等效于 java.lang.Character.isUpperCase()

\p{javaWhitespace}

等效于 java.lang.Character.isWhitespace()

\p{javaMirrored}

等效于 java.lang.Character.isMirrored()

 

 

Unicode 块和类别的类

\p{InGreek}

Greek 块(简单)中的字符

\p{Lu}

大写字母(简单类别

\p{Sc}

货币符号

\P{InGreek}

所有字符,Greek 块中的除外(否定)

[\p{L}&&[^\p{Lu}]] 

所有字母,大写字母除外(减去)

 

 

边界匹配器

^

行的开头

$

行的结尾

\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,作为捕获组

 

 

Back 引用

\n

任何匹配的 nth 捕获组

 

 

引用

\

Nothing,但是引用以下字符

\Q

Nothing,但是引用所有字符,直到 \E

\E

Nothing,但是结束从 \Q 开始的引用

 

常用正则表达式:

匹配中文字符的正则表达式: [u4e00-u9fa5]
——》匹配中文还真是个头疼的事,有了这个表达式就好办了


匹配双字节字符(包括汉字在内):[^x00-xff]
——》可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:ns*r
——》可以用来删除空白行

匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?</1>|<.*? />
——》网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^s*|s*$
——》可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
——》表单验证时很实用

匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
——》网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
——》表单验证时很实用

匹配国内电话号码:d{3}-d{8}|d{4}-d{7}
——》匹配形式如 0511-4405222 或 021-87888822

匹配中国邮政编码:[1-9]d{5}(?!d)
——》中国邮政编码为6位数字

匹配身份证:d{15}|d{18}
——》中国的身份证为15位或18位

匹配ip地址:d+.d+.d+.d+
——》提取ip地址时有用

匹配特定数字:
^[1-9]d*$    //匹配正整数
^-[1-9]d*$   //匹配负整数
^-?[1-9]d*$   //匹配整数
^[1-9]d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]d*.d*|0.d*[1-9]d*$   //匹配正浮点数
^-([1-9]d*.d*|0.d*[1-9]d*)$  //匹配负浮点数
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$  //匹配浮点数
^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$  //匹配非正浮点数(负浮点数 + 0)
——》处理大量数据时有用,具体应用时注意修正


匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^w+$  //匹配由数字、26个英文字母或者下划线组成的字符串





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值