一、概念
正则表达式,又称规则表达式。(英语: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
}
}
五、总结
- 任意一个字符表示匹配任意对应的字符,如a匹配a,7匹配7,-匹配-。
- []代表匹配中括号中其中任一个字符,如[abc]匹配a或b或c。
- -在中括号里面和外面代表含义不同,如在外时,就匹配-,如果在中括号内[a-b]表示匹配26个小写字母中的任一个;[a-zA-Z]匹配大小写共52个字母中任一个;[0-9]匹配十个数字中任一个。
- 在中括号里面和外面含义不同,如在外时,就表示开头,如7[0-9]表示匹配开头是7的,且第二位是任一数字的字符串;如果在中括号里面,表示除了这个字符之外的任意字符(包括数字,特殊字符),如[^abc]表示匹配出去abc之外的其他任一字符。
- .表示匹配任意的字符。
- \d表示数字。
- \D表示非数字。
- \s表示由空字符组成,[ \t\n\r\x\f]。
- \S表示由非空字符组成,[^\s]。
- \w表示字母、数字、下划线,[a-zA-Z0-9_]。
- \W表示不是由字母、数字、下划线组成。
- ?: 表示出现0次或1次。
- +表示出现1次或多次。
- *表示出现0次、1次或多次。
- {n}表示出现n次。
- {n,m}表示出现n~m次。
- {n,}表示出现n次或n次以上。
- XY表示X后面跟着Y,这里X和Y分别是正则表达式的一部分。
- X|Y表示X或Y,比如"food|f"匹配的是foo(d或f),而"(food)|f"匹配的是food或f。
- (X)子表达式,将X看做是一个整体。
六、结束语
正则表达式其实也不过如此,她并没有想象的那么难,反而系统的学习了之后,反而觉得其实她很简单。
忘记了记得回来看看她哟~