JAVA ----正则表达式基础及相关应用

Posted 胡同巷的猫七姑娘~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA ----正则表达式基础及相关应用相关的知识,希望对你有一定的参考价值。

      正则表达式是Java、php等编程语言中相当重要的一环,在实际应用程序代码中相当广泛,更是网络安全领域中不可或缺的一点。下面总讲一下正则表达式的基础知识以及相关应用

     什么是正则表达式:正则表达式(regular expression,简写为regex)是一个字符串,用来描述匹配一个字符串集合的模式。     对于字符串处理来说,正则表达式是一个强大的工具,可以使用正则表达式来匹配、替换和拆分字符串。

目录

HINT 1  匹配字符串

HINT 2  正则表达式语法

HINT 3  替换和拆分字符串


HINT 1  匹配字符串

     从String类中的matches方法(相较于equals方法虽然类似,但是它的功能强大很多)开始看,它不仅可以匹配一个固定的字符串,还可以匹配符合一个模式的字符串集,如以下语句的结果都为true: 

"Java is fun".matches("Java.*")
"Java is cool".matches("Java.*")
"Java is powerful".matches("Java.*")

     看到以上代码,后面的 "Java.*"是一个正则表达式,它描述了一个字符串模式,以Java开始,后面跟0个或者多个字符串。这里,子字符串  .*  匹配0或者多个任意字符   简单点来说就是你前面只要有Java,不论后面是什么都对

这里我们举几个例子来看下matches方法的一些基础用法:String.matches("正则表达式")  

System.out.print("e".matches("[ae|cd]"));
//true
System.out.print("w".matches("[xyw]"));
//true
System.out.print("xy".matches("[xyw]{2}"));
//true
/*前面的[xyz]表示字符串中字符的范围,{2}代表匹配范围为前两位*/
System.out.print("xyqqqqqq".matches("[xyw]{2}"));
//false
/*因为“xyqqqqqqq”只有前两位匹配了但后面的多位都不匹配*/
System.out.print("xyqqqqqq".matches("[xyw]{2}.*"));
//true
/*加上“.*”后只判断{n}中前n位匹配即可*/    

    其实我们写Java用关键字引入类别,比如import java.util.Scanner、import java.util.Arrays等等都可以按这样的方式理解,理解为什么都是写成这个形式,编译器中是如何判断我们输入的代码是正确的,归于什么类别的,包括正则表达式应用于邮箱的创建、判别等等,都是有极大的用处的,这里放一个正则表达式应用于邮箱的链接,值得学习!

java邮箱的表达式_Java邮箱正则表达式_weixin_39955423的博客-CSDN博客

HINT 2  正则表达式语法

      正则表达式由字面值字符特殊符号组成,下面的表格列出了正则表达式常用的语法  

     注意反斜杠是一个特殊的字符,在字符串中开始转义序列,因此Java中需要使用\\\\来表示\\   回顾一下,空白字符是 ' '、'\\t'、'\\n'、'\\r' 或者 '\\f' ,因此,\\s 和 [\\t\\n\\r\\f] 等同, \\s 和 [^ \\t\\n\\r\\f] 等同 

注意!表格中倒数第二行p{n,m}表示n到m次出现模式p,是包含m次的 !下面的例4中用到

有了这个表格的相关表达解释后上面我们举例的matches相关应用也能更容易理解了 ,当然了表格中还有一些需要注意与加以详解的地方,下面总结一下:

1.表中提及的单词字符是任何的字母,数字或者下划线字符,因此 \\w 等同于 [a-z[A-Z][0-9]_] 或者简化为 [a-Za-z0-9_],\\W 等同于 [^a-Za-z0-9]     2.表中后面六个条目 *、 +、 ?、 {n}、 {n, m} 称为量词符,用于确定量词符前面的模式会重复多少次。例如,A* 匹配0或者多个A,A+ 匹配1或者多个A,A?匹配0或者1个A,而 A{3} 精确匹配AAA,A{3, }匹配至少3个A,A{3,6}匹配3到6之间个A,包括前面提到的 *A 等同于 {0,}, + 等同于 {1,}, ? 等同于{0.1}       任意字符串都匹配正则表达式 ".*"                                              警告:不要再重复量词中使用空白。例如,A{3,6} 不能写成逗号后面有一个空白符的 A{3,  6}    3.可以使用括号来将模式进行分组。例如, (ab){3} 匹配 ababab,但是 ab{3} 匹配 abbb

重点理解这个表格,真正去理解正则表达式的语法,它是按照一个怎样的逻辑去写然后实现这个功能的,当然了网上还有许多更加深入的正则表达式的具体应用,下面链接中的博客也总结到了,想更加深入学习了解的也可以自己去搜去实践

Java基础学习总结(21)——常用正则表达式列表 - 一杯甜酒 - 博客园

下面我们也用一些示例来演示如何构建正则表达式:

1.社会安全号的模式是 xxx-xx-xxxx,其中x是一位数字,根据题意得知我们规定的模式就是这样,那么它的正则表达式可以描述为 [\\\\d]{3}-[\\\\d]{2}-[\\\\d]{4}  (需要转义序列,d表示整数)

System.out.print("111-22-3333".matches("[\\\\d]{3}-[\\\\d]{2}-[\\\\d]{4}"));
//True
System.out.print("11-22-3333".matches("[\\\\d]{3}-[\\\\d]{2}-[\\\\d]{4}"));
//False

2.偶数以数字 0、 2、 4、 6 或者 8 结尾,那么偶数的模式可以描述为 [\\\\d]*[02468] 理解

System.out.print("122".matches("[\\\\d]*[02468]"));
//true
System.out.print("123".matches("[\\\\d]*[02468]"));
//false

3.电话号码的模式是 (xxx)xxx-xxxx,这里x是一位数字,并且第一位数字不能为0,那么电话号码的正则表达式可以描述为 \\\\([1-9][\\\\d]{2}\\\\) [\\\\d]{3}-[\\\\d]{4}                                                             注意:   括符在正则表达式中是特殊字符,用于对模式进行分组,为了在正则表达式中表示字面值(或者),必须用转义符\\\\

System.out.print("(912) 921-2343".matches("\\\\([1-9][\\\\d]{2}\\\\) [\\\\d]{3}-[\\\\d]{4}"));
//true
System.out.print("(012) 921-2343".matches("\\\\([1-9][\\\\d]{2}\\\\) [\\\\d]{3}-[\\\\d]{4}"));
//false

4.假定姓由最多25个字母组成,并且第一个字母为大写形式,符合这两个要求的正则表达式(姓的模式)可以写成  [A-Z][a-zA-Z]{1,24}                 这里解释一下这个正则表达式,我们应该按照顺序来匹配,正则都是这样的,所以[A-Z]是匹配第一个字母是否是大写字母,接下来匹配24个大小写都可以的字母,这样很容易理解           注意:同上面讲到的要求一样,不能随便放空白符到正则表达式中,否则报错

System.out.print("Smith".matches("[A-Z][a-zA-Z]{1,24}"));
//ture
System.out.print("Jone123".matches("[A-Z][a-zA-Z]{1,24}"));
//false
System.out.print("yellin".matches("[A-Z][a-zA-Z]{1,24}"));
//false

5.根据Java标识符的定义(1.标识符必须以字母、下划线(_)或者美元符号开始,不能以数字开头 2.标识符是一个由字母、数字、下划线和美元符号组成的字符序列),那么标识符的模式(正则表达式)可以描述为[a-zA-Z_$][\\\\w$]*   这个也按照正则表达式顺序来理解

HINT 3  替换和拆分字符串

       前面所提及的正则表达式的用途还有替换和拆分字符串没讲,这里简单了解一下,如果字符串匹配正则表达式,String类的matches方法返回true,当然了String类也包含repalceAll、replaceFirst和split方法(这个在基础语言中应该应用地相当广泛),用于替换和拆分字符串,用法可在下图中了解,如果想更详尽地知道可以自行去检索

这里举几个例子说明一下                            replaceAll 方法表示替换所有匹配的子字符串    replaceFirst方法表示替换第一个匹配的子字符串

System.out.print("Lyq Lyq Lyq".replaceAll("y\\\\w", "sf"));
//程序运行结果为 Lsf Lsf Lsf
//该方法是替换匹配到的所有子字符串,也就是查别到后面的所有都要替换,这里我们从"y"开始
System.out.print("Lyq Lyq Lyq".replaceFirst("L\\\\w", "X"));
//程序运行结果为 Xyq Lyq Lyq
//一个字母当然也是一个子字符串,这里只更改匹配到的第一个,后面再出现也不再更改
//自己也可以多去尝试一下,比如一个替换多个,这些都是可以的,实践出真知

而split方法有两个重载方式:              1.split(regex)方法使用匹配的分隔符将一个字符串拆分为子字符串,例如以下语句:

String[] love = "Lsf13Xyq14Forever".split("\\\\d\\\\d");
for (int i = 0;i < 3;i++)
{
     System.out.print(love[i] +' ');
}
//程序运行结果为  Lsf Xyq Forever
//这里语句 String[] love = "Lsf13Xyq14Forever".split("\\\\d\\\\d") 将字符串"Lsf13Xyq14Forever" 
//拆分为 Lsf、Xyq以及Forever并且保存在love[0],love[1]和love[2]中,注意我们后面拆分的条件是识别
//到两个数字,这里必须是一一对应的关系,不能只写一个//d,大家可以用多种情况去跑一下,自己检验

 2.split(regex,limit)方法中,limit 参数确定模式匹配多少次,如果 limit <= 0,split(regex,limit) 等同于 split(regex),如果 limit > 0,模式最多匹配 limit - 1次,下面是一些示例:

String[] love = "Lsf13Xyq14Forever".split("\\\\d\\\\d",0);
//拆分为  Lsf, Xyq, Forever   相当于split("\\\\d\\\\d") 无限匹配
String[] love = "Lsf13Xyq14Forever".split("\\\\d\\\\d",1);
//拆分为  LsfXyqForever       拆分limit - 1次,所以此时拆分0次,即不拆分
String[] love = "Lsf13Xyq14Forever".split("\\\\d\\\\d",2);
//拆分为  Lsf, XyqForever     此时拆分2 - 1次
String[] love = "Lsf13Xyq14Forever".split("\\\\d\\\\d",3);
//拆分为  Lsf, Xyq, Forever   此时拆分3 - 1次,拆分完毕
String[] love = "Lsf13Xyq14Forever".split("\\\\d\\\\d",4);
//拆分为  Lsf, Xyq, Forever   大于最大拆分数,也只拆分这么多次

注意:默认情况下,所有量词符都是“贪婪”的,这意味着它们会尽可能匹配多次,比如下面语句会显示 JRvaa,因为第一个匹配成功的是aaa 

System.out.println("Jaaavaa".replaceFirst("a+","R"));

这里不要理解错题目的意思,并不是说在整个字符串中找a最多的子字符串进行替换,而是匹配到第一个含a子字符串尽可能多地将a全部替换掉,比如这里会替换aaa,而非aaa中的一个或者两个a,Jaavaaaa也会被替换成JRvaaaa

解决方法:可以通过在后面添加问号(?)来改变量词符的默认行为。量词符变为“不情愿”或者“惰性”的,这意味着它将匹配尽可能少的次数。例如,下面的语句显示JRaavaa,因为第一个匹配成功的是a

System.out.println("Jaaavaa".replaceFirst("a+?","R"));

     以上就是Java中正则表达式的基础知识与相关应用,实际上正则在各类编程语言中应用得相当广泛,我们生活中的很多功能也是通过正则实现的,大家也可以去搜索相关网课或者博客继续深入学习~ (#^.^#)

以上是关于JAVA ----正则表达式基础及相关应用的主要内容,如果未能解决你的问题,请参考以下文章

Java_类和方法笔记

JAVA是啥意思?

Java16的新特性

学java好找工作吗 为啥学java好找工作

Java是啥?Java到底能干嘛?

Java_数组