正则表达式的匹配规则是从左到右按规则匹配。我们首先来看如何使用正则表达式来做精确匹配。

对于正则表达式abc来说,它只能精确地匹配字符串"abc",不能匹配"ab","Abc","abcd"等其他任何字符串。

如果正则表达式有特殊字符,那就需要用\转义。例如,正则表达式a\&c,其中\&是用来匹配特殊字符&的,它能精确匹配字符串"a&c",但不能匹配"ac"、"a-c"、"a&&c"等。

要注意正则表达式在Java代码中也是一个字符串,所以,对于正则表达式a\&c来说,对应的Java字符串是"a\\&c",因为\也是Java字符串的转义字符,两个\\实际上表示的是一个\:

// regex

----

public class Main {

public static void main(String[] args) {

String re1 = "abc";

System.out.println("abc".matches(re1));

System.out.println("Abc".matches(re1));

System.out.println("abcd".matches(re1));

String re2 = "a\\&c"; // 对应的正则是a\&c

System.out.println("a&c".matches(re2));

System.out.println("a-c".matches(re2));

System.out.println("a&&c".matches(re2));

}

}

如果想匹配非ASCII字符,例如中文,那就用\u####的十六进制表示,例如:a\u548cc匹配字符串"a和c",中文字符和的Unicode编码是548c。

匹配任意字符

精确匹配实际上用处不大,因为我们直接用String.equals()就可以做到。大多数情况下,我们想要的匹配规则更多的是模糊匹配。我们可以用.匹配一个任意字符。

例如,正则表达式a.c中间的.可以匹配一个任意字符,例如,下面的字符串都可以被匹配:

"abc",因为.可以匹配字符b;

"a&c",因为.可以匹配字符&;

"acc",因为.可以匹配字符c。

但它不能匹配"ac"、"a&&c",因为.匹配一个字符且仅限一个字符。

匹配数字

用.可以匹配任意字符,这个口子开得有点大。如果我们只想匹配0~9这样的数字,可以用\d匹配。例如,正则表达式00\d可以匹配:

"007",因为\d可以匹配字符7;

"008",因为\d可以匹配字符8。

它不能匹配"00A","0077",因为\d仅限单个数字字符。

匹配常用字符

用\w可以匹配一个字母、数字或下划线,w的意思是word。例如,java\w可以匹配:

"javac",因为\w可以匹配英文字符c;

"java9",因为\w可以匹配数字字符9;。

"java_",因为\w可以匹配下划线_。

它不能匹配"java#","java ",因为\w不能匹配#、空格等字符。

匹配空格字符

用\s可以匹配一个空格字符,注意空格字符不但包括空格,还包括tab字符(在Java中用\t表示)。例如,a\sc可以匹配:

"a c",因为\s可以匹配空格字符;

"a c",因为\s可以匹配tab字符\t。

它不能匹配"ac","abc"等。

匹配非数字

用\d可以匹配一个数字,而\D则匹配一个非数字。例如,00\D可以匹配:

"00A",因为\D可以匹配非数字字符A;

"00#",因为\D可以匹配非数字字符#。

00\d可以匹配的字符串"007","008"等,00\D是不能匹配的。

类似的,\W可以匹配\w不能匹配的字符,\S可以匹配\s不能匹配的字符,这几个正好是反着来的。

// regex

----

public class Main {

public static void main(String[] args) {

String re1 = "java\\d"; // 对应的正则是java\d

System.out.println("java9".matches(re1));

System.out.println("java10".matches(re1));

System.out.println("javac".matches(re1));

String re2 = "java\\D";

System.out.println("javax".matches(re2));

System.out.println("java#".matches(re2));

System.out.println("java5".matches(re2));

}

}

重复匹配

我们用\d可以匹配一个数字,例如,A\d可以匹配"A0","A1",如果要匹配多个数字,比如"A380",怎么办?

修饰符*可以匹配任意个字符,包括0个字符。我们用A\d*可以匹配:

A:因为\d*可以匹配0个数字;

A0:因为\d*可以匹配1个数字0;

A380:因为\d*可以匹配多个数字380。

修饰符+可以匹配至少一个字符。我们用A\d+可以匹配:

A0:因为\d+可以匹配1个数字0;

A380:因为\d+可以匹配多个数字380。

但它无法匹配"A",因为修饰符+要求至少一个字符。

修饰符?可以匹配0个或一个字符。我们用A\d?可以匹配:

A:因为\d?可以匹配0个数字;

A0:因为\d+可以匹配1个数字0。

但它无法匹配"A33",因为修饰符?超过1个字符就不能匹配了。

如果我们想精确指定n个字符怎么办?用修饰符{n}就可以。A\d{3}可以精确匹配:

A380:因为\d{3}可以匹配3个数字380。

如果我们想指定匹配n~m个字符怎么办?用修饰符{n,m}就可以。A\d{3,5}可以精确匹配:

A380:因为\d{3,5}可以匹配3个数字380;

A3800:因为\d{3,5}可以匹配4个数字3800;

A38000:因为\d{3,5}可以匹配5个数字38000。

如果没有上限,那么修饰符{n,}就可以匹配至少n个字符。

练习

请编写一个正则表达式匹配国内的电话号码规则:3~4位区号加7~8位电话,中间用-连接,例如:010-12345678。

// regex

----

import java.util.*;

public class Main {

public static void main(String[] args) throws Exception {

String re = "\\d";

for (String s : List.of("010-12345678", "020-9999999", "0755-7654321")) {

if (!s.matches(re)) {

System.out.println("测试失败: " + s);

return;

}

}

for (String s : List.of("010 12345678", "A20-9999999", "0755-7654.321")) {

if (s.matches(re)) {

System.out.println("测试失败: " + s);

return;

}

}

System.out.println("测试成功!");

}

}

进阶:国内区号必须以0开头,而电话号码不能以0开头,试修改正则表达式,使之能更精确地匹配。

提示:\d和\D这种简单的规则暂时做不到,我们需要更复杂规则,后面会详细讲解。

小结

单个字符的匹配规则如下:

正则表达式规则可以匹配

A指定字符A

\u548c指定Unicode字符和

.任意字符a,b,&,0

\d数字0~90~9

\w大小写字母,数字和下划线a~z,A~Z,0~9,_

\s空格、Tab键空格,Tab

\D非数字a,A,&,_,……

\W非\w&,@,中,……

\S非\sa,A,&,_,……

多个字符的匹配规则如下:

正则表达式规则可以匹配

A*任意个数字符空,A,AA,AAA,……

A+至少1个字符A,AA,AAA,……

A?0个或1个字符空,A

A{3}指定个数字符AAA

A{2,3}指定范围个数字符AA,AAA

A{2,}至少n个字符AA,AAA,AAAA,……

A{0,3}最多n个字符空,A,AA,AAA

python中else与if的匹配原则_匹配规则相关推荐

  1. Python中的标识符有哪些基础原则?

    很多同学学习Python技术的过程中,会接触一些标识符的知识,这部分也是Python的基础知识,那么Python中的标识符有哪些基础原则?接下来我们一起来看看详细的内容介绍吧,希望对你们有Python ...

  2. 三、Python第三课——Python中数字的用法及编码原则(Python禅意)

    目录 一.Python中的数字 1.整数 2.浮点数 3.整数.浮点数和字符串的联系和区别 二.编码原则 1.为代码增加注释 2.Python 禅意 A.编码精美 B.避繁就简 C.无简就繁 D.使用 ...

  3. 简述一下索引的匹配原则_【进阶之路】索引中一些易忽视的点

    导言 大家好,我是练习java两年半时间的南橘,下面是我的微信,需要之前的导图或者想互相交流经验的小伙伴可以一起互相交流哦. 这是这篇文章的思维导图,因为用的是免费版的软件,所以有不少水印,需要的可以 ...

  4. python中RabbitMQ的使用(路由键模糊匹配)

    路由键模糊匹配 使用正则表达式进行匹配.其中"#"表示所有.全部的意思:"*"只匹配到一个词. 匹配规则: 路由键:routings = [ 'happy.wo ...

  5. python中遍历结构可以是哪些数据类型_全!Python基础之原生数据类型、判断和循环、函数和文件操作合集...

    长文预警! Python基础系列会将基础内容大致分为三到五个板块,每块着重讲一方面,知识不会很难,主要是以小例子的形式解读,如果你已经入门Python,希望可以帮你温习一下:如果你想入门Python, ...

  6. python中 a or b 的值为_若a=1, b=2,那么(a or b)的值为( )。 (2.0分)_学小易找答案...

    [单选题]假设a=9, b=2,那么下面运算中,错误的是( ). (2.0分) [填空题]若a=10, b=20, 那么(a and b)结果为( ). (2.0分) [填空题]表达式 int('12 ...

  7. python中常见的三种选择结构_在Python中,实现多分支选择结构的最佳方法是

    在Python中,实现多分支选择结构的最佳方法是 答:if-elif-else 绘制建筑平面图时,被剖切的墙用 线绘制,定位轴线用 线绘制 答:粗实 细点画 智慧职教: 下列关于书写住院病历的叙述不正 ...

  8. python中斜杠加引号什么意思_如何在Python中转义反斜杠和单引号或双引号?

    你是怎么做到的 如果你的"长字符串"是从文件中读取的(正如你在评论中提到的),那么你的问题是误导性的.因为你显然不完全理解逃逸的工作原理,所以你写下的问题可能与你真正的问题不同. ...

  9. python中import语句的作用是什么_什么是Pythonimport语句?在Python中的import语句作用有哪些?...

    Python import语句是用来导入模块的,在python模块库中有着大量的模块可供使用,import语句作用是把文件需要用的指定模块导入到当前程序中. import语句的作用 import语句作 ...

最新文章

  1. mysql 存储过程 格式化_转 mysql 存储过程初探
  2. 介绍SLICEM里的LUT如何形成RAM资源
  3. 新手学测试----Unit Test(单元测试)
  4. 攻防世界(Pwn)dice_game, 栈溢出覆盖srand种子
  5. 三数之和为0(c语言实现)(改进)
  6. 微服务技术栈及分享计划
  7. DW 在onload运行recordset find.html时 发生了以下javascript错误
  8. 定义下一代存储,打造全新一代数据基础设施
  9. linux stat命令详解
  10. mybatis 增删改查测试
  11. Linux Iptables 语法大全
  12. 《21天学通Java(第7版)》—— 1.10 练习
  13. 学生签到系统c代码_C语言之学生管理系统代码(完整)
  14. PLECS的热模型无法导入的解决办法
  15. 学习Maya学习MayaArnoldArnold
  16. utf8版 中文转换成拼音
  17. 【C语言练习4】根据公式计算π的值,π=4-4/3+4/5-4/7+4/9+... 打印出一个表格来显示,用公式中的1项、2项、3项...计算出来π的近似值
  18. java 图形学_JAVA画图形学-实验报告
  19. javaweb07 jquery+ajax技术实现异步请求登录
  20. 华为od机考真题-数组拼接

热门文章

  1. bash: ping: command not found
  2. 我的世界java启动程下载_我的世界JAVA下载 运行必备官方下载地址
  3. Git 的代码管控机制
  4. Linux新手训练营--文件管理
  5. 微信小游戏开发文档(4)
  6. 【专利】专利申请书撰写
  7. CVE-2012-1823:phpcgi 代码执行
  8. svelte 学习记录(一)
  9. 洛谷 P1983 车站分级(拓扑排序)
  10. 华信IT教育201611第一篇博客