正则表达式的理论基础
普通字符的表示
我们说正则表达式主要由普通字符和元字符组成,那么我们首先先看看普通字符该如何表示。大部分普通字符由字符本身即可表示,例如: s
、 i
、 n
、 g
、 l
、 e
等。除此之外,也有一些特殊的表示方式。
- 以
/0
开头,后面紧跟 1-3 位数字,表示的是一个八进制数。这个数的十进制值对应于 ASCII 编码中的相应字符。 - 以
/x
或者/X
开头,后面紧跟两位字符,表示的是一个十六进制的数。该数的十进制的值对应于 ASCII 编码中相应的字符。 - 以
/u
开头,后面紧跟四位字符,表示一个 Unicode 编号。该编号对应于 Unicode 字符集中的一个具体字符。
元字符
元字符是在正则表达式中有特殊意义的字符
常用的元字符:
在某种特殊情况下,需要将这些元字符当做普通字符使用,我们使用 \
+ 元字符,表示转移该元字符,此后该元字符将表示一个普通字符。例如: \\\
, \\^
,它们分别表示的是 \\
和 ^
,不再具有特殊含义了。下面我们开始逐渐介绍正则表达式语法中的元字符的特殊含义。
但是需要注意的是:Java 中的 String 中"\"本来就是转义的意思,如果我们需要匹配"\"就需要写成“\\\\”.
String str = "a\\b";
String regex = "\\\\";
str = str.replaceAll(regex, "x");
System.out.println(str);//输出:axb
字符组匹配单个字符
我们用一对中括号 ([.....])
表示字符组,整个字符组中会有多个字符位列其中,该字符组表示的含义是:匹配任意一个字符,该字符是位列字符组中的。
例如: [single]
匹配的是字符 s
、 i
、 n
、 g
、 l
、 e
中的任意一个字符。以上我们简单介绍了字符组的基本概念以及它所能匹配的内容,其实有时候为了表述连续的字符,我们会结合元字符 -
一起来操作字符组。例如: [0123456789]
,匹配的是 0 到 9 之间的任意一个数字,对于这种情况我们可以选择这样来简化操作: [0-9]
。
其实两者表述的含义是一样的,为了简化起见,如果遇到连续的字符表述,可以选择使用元字符来简化。同样的还有 [a-z]
,它匹配任意一个小写字母。对于元字符 -
还需要说明一点的是:该字符只有出现在两个字符之间才具有特殊含义,单独出现在字符组的所有字符之前或者之后只能表述普通字符 -
。下面介绍有关字符组的一些其他相关的元字符。
元字符 ^
在 字符组 中表示排除的意思,只有放在所有字符的最前面才具有特殊含义,否则只能表示普通字符。例如: [^1234]
,该字符组匹配一个字符,但是不是 1 或 2 或 3 或 4。当然, [c^yy]
,匹配的是四个普通字符: c
、 ^
、 y
、 y
。此外,需要注意一点的是,除了以上介绍的几种元字符必须置放于指定位置上才能起作用以外,其余所有元字符在字符组中统统被视作普通字符,不再具有特殊含义。
量词
量词: *
、 +
、 ?
、 {min,max}
它们主要用于指定量词前面的字符在匹配时可以多次出现。
例如:
se*cyy
:其中 e 出现 0-无穷次se{0,10}cyy
:其中 e 可以出现 0-10 次se{9}cyy
:其中 e 必须出现 9 次se{3,}
:其中 e 出现 3-正无穷次
分组
在介绍分组之前,无论是使用量词还是字符组都是针对的一个字符。而分组针对的就是一串字符,我们也可以对分组使用量词,控制该分组出现的次数。 我们使用 ()
括号表示分组,例如:
sing(le)+cccc
:在该正则表达式中,分组le
可以出现一次或者多次sing(le)*cccc
:在该正则表达式中,分组le
可以出现零次或者多次
还可以在 分组 中使用 |
表示或:
String str = "aaabbb";
String regex = "^(aaa|bbb)+"; // 表示 aaa 或 bbb 在目标字符串开头至少出现一次
System.out.println(str.matches(regex)); // 返回 true
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: Object 类中的 clone 方法
下一篇: 谈谈自己对于 AOP 的了解
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论