Java—正则表达式

一、引言

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

二、匹配字符串

让我们从String 类中的 matches 方法开始。例如:以下两个语句结果都为 true 。

"Java".mathches("Java");
"Java".equals("Java");

matches 方法很类似 equals 方法,但 matches 方法的功能更加强大。它不仅可以匹配固定字符串,还可以匹配一个模式的字符串集。例如,以下语句结果都为 true。

"Java is fun".matches("Java.*")
"Java is cooV.matchesCJava.*")
"]ava is powerful".matches("Java.*")

前面语句中的"Java.*"是一个正则表达式。它推述了一个字符串模式,以 Java 开始,后面跟 0 个或者多个字符串。这里,子字符串匹配任何0个或者多个字符。

三、正则表达式语法

正则表达式由字面值字符和特殊符号组成。表 1 列出了正则表达式常用的语法。
表 1 常用的正则表达式
在这里插入图片描述
在这里插入图片描述
注意:

  1. 反斜杠是一个特殊的字符,在字符串中开始转义序列。因此 Java 中需要使用 \\d
    来表示 \d。
  2. 空白字符是 ’ ’、’\t’、’\n\ ‘,’\r’, 或者 ‘\f’ 。因此,\s 和 [ \t \n \r \f]等同,\S 和[ ^ \t \n \r \f]等同。
  3. 单词字符是任何的字母、数字或者下划线字符。因此 \w 等同于 [a - z [A - Z] [0 - 9]_] 或者简化为 [a-Za-z0-9_]。\W 等同于 [ ^a-Za-z0-9]。
  4. 表 1 中最后六个实体 *、+、?、{n}、{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。* 等同于{0,}, + 等同于{1,}, ? 等同于{0 . 1}。
  5. 可以使用括号来将模式进行分组。例如,(ab){3} 匹配 ababab, 但是 ab{3} 匹配 abbb。

警告:不要在重复量词符中使用空白。例如,A{3 , 6}不能写成逗号后面有一个空白符的A{3, 6}。

四、示例

让我们用一些示例来演示如何构建正则表达式。

1、示例 1
社会安全号的模式是 XXX-XX-XXX, 其中 X 是一位数字。社会安全号的正则表达式可以描述为 [\\d]{3}-[\\d]{2}-[\\d]{4}
例如
“111-22-3333”.匹配("[\\d]{3}-[\\d]{2}-[\\d]{4}") 返回 true.
“11-22-3333”.匹配("[\\d]{3}-[\\d]{2}-[\\d]{4}") 返回 false.

2、示例 2
偶数以数字 0、2、4、6 或者 8 结尾。偶数的模式可以描述为[\\d]*[02468]
例如,
“123”.matches("[\\d]*[02468]) 返回 false.
“122”.matches("[\\d]*[02468]
) 返回true.

3、示例 3
电话号码的模式是(XXX)XXX-XXXX,这里 X 是一位数字,并且第一位数字不能为 0。电话号码的正则表达式可以描述为\\([1-9][\\d]{2}\\) [\\d]{3}-[\\d]{4}
注意:括符( 和 )在正则表达式中是特殊字符,用于对模式分组。为了在正则表达式中表示字面值( 或者 ),必须使用 \\( 和 \\)。
例如:
“(912) 921-2728”.matches("\\([1-9][\ \d]{2}\\) [\\d]{3}-[\\d]{4}") 返回 true.
“921-2728” .matchesr(\\([1-9][\\d]{2}\\) [\\d]{3}-[\\d]{4}") 返回 false.

4.示例 4
假定姓由最多 25 个字母组成,并且第一个字母为大写形式。则姓的模式可以描述为 [A-Z][a-zA-Z]{1,24}
注意:不能任意放空白符到正则表达式中。如 [A-Z][a-Za-z]{1, 24}将报错。例如:
“Smith”.matches("[A-Z][a-zA-Z]{1,24}") 返回 true.
“Jones123”.matches("[A-Z][a-zA-Z]{1,24}")返回 false.

5.示例 5
Java 标识符

  • 标识符必须以字母、下划线( _ ), 或者美元符号($) 开始。不能以数字开头。
  • 标识符是一个由字母、数字、下划线( _ ) 和美元符号组成的字符序列。

标识符的模式可以描述为 [a - zA-Z_$][\\w$]*

6.示例 6
什么字符串匹配正则表达式"Welcome to (Java | HTML)" ?
答案是 Welcome to Java 或者 Welcome to HTML。

7.示例 7
什么字符串匹配正则表达式"A.*" ?
答案是任何以字母 A 开头的字符串。

五、替换和分割字符串

如果字符串匹配正则奉达式,String 类的 matches 方法返回 true。String 类也包含 repalceAll、replaceFirst 和 split 方法,用于替换和分割字符串,如图 2 所示。
在这里插入图片描述
在这里插入图片描述

图 2 String 类包含使用正则表达式来匹配、 替换和分割字符串的方法
replaceAll 方法替换所有匹配的子字符串,replaceFirst 方法替换第一个匹配的子字
符串。例如,下面代码

System.out.println("Java Java Java".replaceAl1 ("v\\w", "wi"));

显示 Jawi Jawi Jawi
下面代码

System.out.println("Java Java Java".replaceFirst("v\\w", "wi"));

显示 Jawi Java Java

有两个重载的 split:方法。sPlit「( egex)方法使用匹配的分割符将一个字符串分割为子字符串。例如,以下语句

String[] tokens ="JavalHTML2Perl".split("\\d");

将字符串 “JavaHTML2Perl” 分割为 Java、HTML 以及 Perl 并且保存在 tokens[0] , tokens[1]以及 tokens[2] 中。

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

"JavalHTML2Perl".split("\\d", 0); 分割为 Java, HTML, Perl
"JavalHTML2Perl".split("\\d", 1); 分割为JavalHTML2Perl
"JavalHTML2Perl".split("\\d", 2); 分割为Java, HTML2Perl
"JavalHTML2Perl".split("\\d", 3); 分割为Java, HTML, Perl
"JavalHTML2Perl".split("\\d", 4); 分割为Java, HTML, Perl
"JavalHTML2Perl".split("\\d", 5); 分割为Java, HTML, Perl

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

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

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

System.out.println("Jaaavaa".replaceFirst("a+?", "R")):
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值