如何理解正则表达式?

正则表达式是在Unix上开始流行起来的,主要用于字符串的匹配,查找和替换,比如参数传递的识别。在java中,java.lang.String,java.util.regex分别提供了操作正则表达式的方法。

正则表达式的基础语法以及部分特殊字符:

".":表示匹配一个字母;"*":表示0个或多个;"+":表示1个或多个;"?":表示至多1个

"[abc]":匹配abc中的一个字符;[^abc]:取反,匹配不是abc的字符

[a-z]|[A-Z]:匹配a-z或者A-Z中的字符(等同于[a-z[A-Z]])

[A-Z&&[BCD]]:匹配A-Z的字符并且这个字符属于BCD中的字符

\s:表示一个空白字符;\w:表示形成单词的字符[a-zA-z_0-9]

边界匹配:

"^":表示开始;"$":表示结束

"\b":表示一个单词的边界;"^"在[]里表示取反,在[]之外则表示匹配的开始

java中正则表达式的使用:

在java.lang.String中,提供了matches(String regx)的方法匹配字符串;而在java.util.regex提供了Pattern模式和Matcher,正则表达式预编译,存放到pattern中,之后matcher匹配时便可直接匹配,match(string); 将匹配的结果存放在Matcher对象中,在速度上会比较快。

Pattern p = Pattern.compile("[a-z]{3}");

Matcher m = p.matcher(str);  //匹配整个字符串str

Pattern.compile(regx)除了表达式之外,还可以带参数匹配,Pattern.compile(regx , Pattern.CASE_INSENSITIVE):表示忽略大小写按正则表达式的规格进行匹配

再说一说正则表达式分组

正则表达式的分组用小括号"()"隔开,分组可以实现抽取正则表达式匹配结果的一部分。举个例子,在一篇内容中,找出3-5个字母开头,2个数字结尾的字符串。于是可以我用"^[a-z]{3,5}\d{2}$"进行匹配,简单实现如下:

Pattern p = Pattern.compile("^[a-z]{3,5}\d{2}$");
Matcher p = p.matcher(str);
while(p.find()){
m.group()
}

但换个要求,找出3-5个字母开头,2个数字结尾的字符串中的字母,此时我可以在while()中把匹配后的字符串作为参数再写一条正则表达式进行匹配,但这样写出来的代码量太多了,因此java中给正则表达式封装了分组,便于我们进行分组查找。比如,对于以上要求,我们可以修改正则表达式为"^([a-z]{3,5})(\d{2})$",采用分组的方式,把正则表达式分为3组,正则表达式本身为1组,[a-z]{3,5}为1组,\d{2}为1组,分组的顺序从左到右根据左括号进行计算。m.group()不传递参数可以理解为不分组匹配字符串。因此,对于以上要求我可以这样实现:

Pattern p = Pattern.compile("^([a-z]{3,5})(\d{2})$");
Mathcher m = p.matcher(str);
while(p.find()){
   m.group(1)
}

猜你喜欢

转载自blog.csdn.net/hsf15768615284/article/details/77411246