正则表达式语法详解

目录

1. 转义号\\

2. 字符匹配符

3. 选择匹配符

4. 限定符

5. 定位符

6. 分组

6.1 常用分组

6.2 特别分组


想要灵活的运用正则表达式,必须了解各种元字符的功能。元字符从功能上大致分为:限定符、选择匹配符、分组组合和反向引用符、特殊字符、字符匹配符、定位符。

1. 转义号\\

(1)在使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,甚至会报错的。

(2)在Java的正则表达式中,两个\\代表其他语言中的一个\。

(3)需要用到转义符的字符有:* + ( ) $ / \ ? [ ] ^ { }

2. 字符匹配符

(1)符号一览

符号

含义

示例

解释

[]

可接收的字符列表,也可以放入各种符号,来匹配符号本身

[efgh]

[&%#]

匹配e、f、g、h中的任意一个字符;匹配&、%、#中的任意一个字符

[^]

不接收的字符列表

[^abc]

除a、b、c之外的任意一个字符,包括数字和特殊符号

-

连字符

A-Z

任意单个大写字母

.

匹配除\n以外的任何字符

a..b

以a开头,b结尾,中间包括2个任意字符的长度为4的字符串

\\d

匹配单个数字字符,相当于[0-9]

\\d{3}(\\d)?

包含3个或4个数字的字符串

\\D

匹配单个非数字字符,相当于[^0-9]

\\D(\\d)*

以单个非数字字符开头,后接任意个数字字符串

\\w

匹配单个数字、大小写字母的字符,相当于 [0-9a-zA-Z]

\\d{3}\\w{4}

以3个数字字符开头的长度为7的数字字母字符串

\\W

匹配单个非数字、非大小写字母的字符,相当于[^0-9a-zA-Z]

\\W+\\d{2}

以至少1个非数字字母字符开头,2个数字字符结尾的字符串

\\s

匹配任何空白字符(空格、制表符等)

\\s

\\S

匹配任何非空白字符

\\S

(2)Java的正则表达式默认是区分字母大小写的,需要通过(?i)符号,或创建Pattern对象时,调用CASE_INSENSITIVE实现不区分字母大小写。

例:

①(?i)abc 表示abc都不区分大小写

②a(?i)bc 表示bc不区分大小写

③a((?i)b)c 表示只有b不区分大小写

④Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);

3. 选择匹配符

(1)在匹配某个字符串时是选择性的,即:既可以匹配这个,又可以匹配那个。

(2)选择匹配符|,匹配“|”之前或之后的表达式。如ab|cd,表示ab或cd。

4. 限定符

用于指定前面的字符和组合项连续出现多少次。(注:Java匹配默认是贪婪匹配,即尽可能匹配多的数)

符号

含义

示例

解释

*

指定字符重复0次或n次

(abc)*

仅包含任意个abc的字符串,等效于\w*

+

指定字符重复1次或n次(至少一次)

m+(abc)*

以至少1个m开头,后接任意个abc的字符串

?

指定字符重复0次或1次(至多一次)

m+abc?

以至少1个m开头,后接ab或abc的字符串

{n}

只能输入n个字符

[abcd]{3}

由abcd中字母组成的任意长度为3的字符串

{n,}

指定至少n个匹配

[abcd]{3,}

由abcd中字母组成的任意长度不小于3的字符串

{n,m}

指定至少n个但不多于m个匹配

[abcd]{3,5}

由abcd中字母组成的任意长度不小于3,不大于5的字符串

如果要实现“非贪婪匹配”,就在限定符最后加一个?号。如 \\d+? 就可以每次只匹配一个符号。

5. 定位符

定位符规定要匹配的字符串出现的位置,比如在字符串的开始还是在结束的位置。

符号

含义

示例

解释

^

指定起始字符

^[0-9]+[a-z]*

以至少1个数字开头,后接任意个小写字母的字符串

$

指定结束字符

^[0-9]\\-[a-z]+$

以1个数字开头后接连字符-,并以至少1个小写字母结尾的字符串

\\b

匹配目标字符串的边界(指子串间有空格,或目标字符串的结束位置)

han\\b

匹配字符串中 空格前或结束时的han

(如han111han 234han

\B

匹配目标字符串的非边界

han\\B

和\b的含义相反

(如han111han 234han)

6. 分组

6.1 常用分组

①(pattern)  非命名捕获。捕获匹配的子字符串。编号为零的第一个捕获是由整个正则表达式模式匹配的文本,其它捕获结果则根据左括号的顺序从1开始自动编号。

②(?<name>pattern)  命名捕获。将匹配的子字符串捕获到一个组名称或编号名称中。用于name的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如(?'name')。

在使用matcher.group()获取指定字符串内容时,就可以直接使用组名来获取matcher.group("name")。

6.2 特别分组

①(?:pattern)  匹配pattern但不捕获该匹配的子表达式,即是一个非捕获匹配,不存储供以后使用的匹配。这对于用 "or" 字符 (|) 组合模式部件的情况很有用。例如 'industr(?:y|ies)'是比'industry|industries'更经济的表达式。

②(?=pattern)  匹配处于pattern的字符串的起始点的搜索字符串,是一个非捕获匹配。例如,'Windows(?=95|98|NT|2000)'匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。

③(?!pattern)  匹配不处于pattern的字符串的起始点的搜索字符串,是一个非捕获匹配。例如,'Windows (?!95|98|NT|2000)'匹配"Windows 3.1"中的“Windows",但不匹配"Windows 2000"中的"Windows"。

相关推荐

  1. 表达式语法详解

    2024-05-11 01:34:02       36 阅读
  2. 表达式详解

    2024-05-11 01:34:02       27 阅读
  3. Python 表达式语法

    2024-05-11 01:34:02       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-11 01:34:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-11 01:34:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-11 01:34:02       82 阅读
  4. Python语言-面向对象

    2024-05-11 01:34:02       91 阅读

热门阅读

  1. 超像素分割【代码】

    2024-05-11 01:34:02       34 阅读
  2. elasticsearch安装配置注意事项

    2024-05-11 01:34:02       32 阅读
  3. springboot习题

    2024-05-11 01:34:02       25 阅读
  4. 创建MySQL范围分区表详细指南

    2024-05-11 01:34:02       31 阅读
  5. 2024.5.9 —— LeetCode 高频题复盘

    2024-05-11 01:34:02       33 阅读
  6. SCAU 动态规划算法

    2024-05-11 01:34:02       33 阅读
  7. MyBatis中if判断(踩坑)

    2024-05-11 01:34:02       30 阅读
  8. Android应用开发-回声消除AEC

    2024-05-11 01:34:02       41 阅读
  9. 设计模式——迭代器模式(Iterator)

    2024-05-11 01:34:02       30 阅读
  10. MySQL环境搭建

    2024-05-11 01:34:02       34 阅读
  11. 产业链图谱在优化供应链管理中的作用

    2024-05-11 01:34:02       35 阅读
  12. Channel实现Flutter与原生平台之间的双向通信

    2024-05-11 01:34:02       27 阅读
  13. 达梦数据库常用命令整理

    2024-05-11 01:34:02       24 阅读