ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

正则表达式(总结篇)

2020-12-08 20:30:16  阅读:264  来源: 互联网

标签:总结 regex 匹配 String 字符 正则表达式 string


一、概念

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。在众多语言中都可以支持正则表达式,如Perl、PHP、Java、Python、Ruby等。当然在Java中也可以通过处理字符串的方式达到检索,替换文本字符串的目的,但是有了正则表达式写代码更加简洁,通常两三行代码就可以达到目的,当然这也是建立在熟悉正则表达式的基础之上的。

二、基础语法

1、正则表达式是什么?
正则表达式,就是用某种模式去匹配一类字符串的公式。学习正则表达式就是学习怎样定义一种“模式”的语法,说白了,就是学习各种匹配的规则,例如匹配数字要怎么写,匹配字符要怎么写等等。
2、导入的包
在java中调用正则表达式的类是java.util.regex.Matcher和java.util.regex.Pattern,java.util.regex包是从jdk1.4开始提供的。有多种写法来使用正则表达式。
仅仅是匹配
方法1:

import java.awt.peer.PanelPeer;
import java.lang.reflect.Array;
import java.util.regex.Pattern;

public class Demo7 {

	public static void main(String[] args) {
		//要匹配的字符
		String string="8";
		//正则表达式(匹配模式)
		String regex="[0-9]";//匹配原理解析:表示匹配0~9的任意一个数,后面会具体讲解
		//返回匹配的结果,匹配成功就返回true,失败就返回false,此次匹配返回true。
		boolean flag=Pattern.matches(regex, string);
		System.out.println(flag);//true
	}

}

关键代码:boolean flag=Pattern.matches(regex, string);

方法2:

import java.awt.peer.PanelPeer;
import java.lang.reflect.Array;
import java.util.regex.Pattern;

public class Demo7 {

	public static void main(String[] args) {
		//要匹配的字符
		String string="A";
		//正则表达式(匹配模式)
		String regex="[0-9]";//匹配原理解析:表示匹配0~9的任意一个数,后面会具体讲解
		//返回匹配的结果,匹配成功就返回true,失败就返回false,此次匹配返回true。
		System.out.println(string.matches(regex));//false
	}
}

关键代码:string.matches(regex)

一般常用方法2,看个人喜好选择其中一种即可。

三、正则语法

1、常用元字符
正则表达式常用的元字符如下:
在这里插入图片描述
2、连接符
在正则表达式中,匹配数字或者英文字母的书写非常不方便。因此,正则表达式引入了连接符“-”来定义字符的范围。
在这里插入图片描述
3、限定符
限定符,就是限定某个或某类字符出现的次数。
常用的正则表达式限定符如下:
在这里插入图片描述
4、定位符
在正则表达式中,定位符,说白了,就是限定某些字符出现的位置。
常用的正则表达式定位符如下:
在这里插入图片描述
5、转义字符
1)JavaScript中的转义字符
正则表达式本身有它的一套转义字符。正则表达式中的转义字符跟JavaScript中的转义字符是不一样的,仅仅是概念理解一样,大家要区分一下。
在这里插入图片描述
2)正则表达式中的转义字符
我们都知道正则表达式包括2种字符:(1)普通字符;(2)特殊字符。如果我们要匹配正则表达式中的特殊字符,我们就必须在该特殊字符前面加上反斜杠“\”将其进行转义。
举例:
go+
分析:
因为+是正则表达式的特殊符号,因此必须在+前面加上“\”对其进行转义。

例如要匹配字面意义的“\”,就需要使用“\”表示。

需要转义的字符有:$(、)、+.[]?、***/^{}|

6、分组
分组又称为子表达式,即把一个正则表达式的全部或部分分成一个或多个组。其中,分组使用的字符为“(”和“)”,即左圆括号和右圆括号。分组之后,用小括号括起来的表达式看出一个整体来处理。

7、选择符
选择匹配符,很简单。在正则表达式中,选择匹配符是“|”,用于选择匹配2个选项之中的任意一个,类似JavaScript中的“或”运算。

例如,“abc|def1”匹配的是“abc”或“def1”,而不是“abc1”或“def1”。如果要匹配“abc1”或“def1”,应该使用分组符,即“(abcd|efgh)1”。

8、优先级顺序
在这里插入图片描述
上面优先级是从高到低排列。

四、方法

(1)匹配matches()
在前面已经使用了匹配的方法,在此就不再例举了。


关键代码:boolean flag=Pattern.matches(regex, string);
关键代码:string.matches(regex)

(2)替换replaceAll()

public class Demo7 {
	public static void main(String[] args) {
		//要匹配的字符串
		String string="45cf45dG892Df";//有数字、字母大小写组成
		//正则表达式(匹配模式)
		String regex="[a-zA-Z]+";
		//正则表达式(匹配模式)
		String regex2="\\d+";
		//将字符串中英文字母替换为&符号,输出结果为:45&45&892&
		System.out.println(string.replaceAll(regex, "&"));
		//将字符串中单个数字或者连续的数字替换为0,输出结果为:0cf0dG0Df
		System.out.println(string.replaceAll(regex2, "0"));
	}
}

(3)切割,根据大写字母切割字符串。split()

public class Demo7 {

	public static void main(String[] args) {
		//要匹配的字符串
		String string="45cf45dG892Df";//有数字、字母大小写组成
		//正则表达式(匹配模式)
		String regex="[A-Z]";
		//根据大写字母切割字符串
		String[] arr=string.split(regex);
		for(String s:arr) {
			System.out.println(s);
		}
		//输出结果为:
		//45cf45d
		//892
		//f
	}
}

五、总结

  1. 任意一个字符表示匹配任意对应的字符,如a匹配a,7匹配7,-匹配-。

  2. []代表匹配中括号中其中任一个字符,如[abc]匹配a或b或c。

  3. -在中括号里面和外面代表含义不同,如在外时,就匹配-,如果在中括号内[a-b]表示匹配26个小写字母中的任一个;[a-zA-Z]匹配大小写共52个字母中任一个;[0-9]匹配十个数字中任一个。

  4. 在中括号里面和外面含义不同,如在外时,就表示开头,如7[0-9]表示匹配开头是7的,且第二位是任一数字的字符串;如果在中括号里面,表示除了这个字符之外的任意字符(包括数字,特殊字符),如[^abc]表示匹配出去abc之外的其他任一字符。

  5. .表示匹配任意的字符。

  6. \d表示数字。

  7. \D表示非数字。

  8. \s表示由空字符组成,[ \t\n\r\x\f]。

  9. \S表示由非空字符组成,[^\s]。

  10. \w表示字母、数字、下划线,[a-zA-Z0-9_]。

  11. \W表示不是由字母、数字、下划线组成。

  12. ?: 表示出现0次或1次。

  13. +表示出现1次或多次。

  14. *表示出现0次、1次或多次。

  15. {n}表示出现n次。

  16. {n,m}表示出现n~m次。

  17. {n,}表示出现n次或n次以上。

  18. XY表示X后面跟着Y,这里X和Y分别是正则表达式的一部分。

  19. X|Y表示X或Y,比如"food|f"匹配的是foo(d或f),而"(food)|f"匹配的是food或f。

  20. (X)子表达式,将X看做是一个整体。

六、结束语

正则表达式其实也不过如此,她并没有想象的那么难,反而系统的学习了之后,反而觉得其实她很简单。
忘记了记得回来看看她哟~
掰了掰啦~~

标签:总结,regex,匹配,String,字符,正则表达式,string
来源: https://blog.csdn.net/zhangzhanbin/article/details/110880117

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有