java正则表达式

经常会需要编写代码来验证用户输人,比如验证输入是否是一个数字,是否是一个全部小写的字符串,或者社会安全号。如何编写这种类型的代码呢?一个简单而有效的做法是使用正则表达式来完成这个任务。
正则表达式(regularexpression, 简写为regex) 是一个字符串, 用来描述匹配一个字符串集合的模式。对于字符串处理来说,正则表达式是一个强大的工具。可以使用正则表达式来匹配、替换和拆分字符串。

1.匹配字符串
让我们从String类中的matches方法开始。乍一看, matches方法很类似equa1s方法。例如, 以下两个语句结果都为true。
“Java”. matches(“Java”) ;
“Java”.equa1s(“Java”) ;
然而, matches方法功能更加强大。它不仅可以匹配一个固定的字符串,还可以匹配符合一个模式的字符串集。例如,以下语句结果都为true。
在这里插入图片描述
前面语句中的"Java.*"是一个正则表达式。它描述了一个字符串模式, 以Java开始,后面跟0个或者多个字符串。这里,子字符串.*匹配0或者多个任意字符。

2.正则表达式语法
正则表达式由字面值字符和特殊符号组成。表H-1列出了正则表达式常用的语法。
*注意:*反斜杠是一个特殊的字符, 在字符串中开始转义序列。因此Java中需要使用\来表示\。
*注意:*回顾一下,空白字符是’’、’\t’、’\n’、’\r’,或者’\f’。因此,\s和[\t\n\r\f]等同,\S和[^\t\n\r\f]等同。
在这里插入图片描述
在这里插入图片描述
*注意:*单词字符是任何的字母,数字或者下划线字符。因此\w等同于[a-z[A-Z][0-9]]或者简化为[a-Za-z0-9]。\W等同于[^a-Za-z0-9]。
注意:表H-1中后面六个条目、+、?、{n} 、{n, } 以及{n,m} 称为量词符(quantifier),用于确定量词符前面的模式会重复多少次。例如,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}。
*警告:*不要在重复量词符中使用空白。例如,A{3,6}不能写成逗号后面有一个空白符的A{3,6}。
*注意:*可以使用括号来将模式进行分组。例如,(ab) {3} 匹配ababab, 但是ab{3} 匹配a bbb。

让我们用一些示例来演示如何构建正则表达式。
1.示例1
社会安全号的模式是xxx-xx-xxx,其中x是一位数字。社会安全号的正则表达式可以描述为
[\d]{3}-[\d]{2}-[\d]{4}
例如
“111-22-3333".matches("[\d] {3} -[\d] {2} -[\d] {4} “) returns true.
“11-22-3333”.matches(”[\d] {3} -[\d] {2} -[\d] {4} “) returns false .
2.示例2
偶数以数字0、2、4、6或者8结尾。偶数的模式可以描述为
[\d]*[02468]
例如,
“123”.matches(”[\d] *[02468]") returns fa1se.
“122".matches("[\d] *[02468]") returns 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} “)
returns true.
“921-2728”.matches(“\([1-9][\d] {2} \)[\d] {3} -[\d] {4} ") returns
fa1se.
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} “) returns true.
“Jones123”.matches (”[A-Z][a-zA-Z] {1,24} ") returns fa1se.
5.示例5
Java标识符在2.4节中定义。
●标识符必须以字母、下划线(_),或者美元符号(KaTeX parse error: Expected group after '_' at position 71: …描述为 [a-zA-Z_̲][\w$]

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

3.替换和拆分字符串
如果字符串匹配正则表达式,String类的matches方法返回true。String类也包含repa1ceA11、rep1aceFirst和sp1it方法,用于替换和拆分字符串,如图H-1所示。
rep1aceA11方法替换所有匹配的子字符串,rep1aceFirst方法替换第一个匹配的子字
符串。例如,下面代码
System .out.print1n(“Jav aJavaJava”.replaceA11(“v\w”,“wi”));
显示
Jawi Jawi Jawi
下面代码
System .out.print1n(“JavaJ avaJava”.replaceFirst(“v\w”,“wi”));
显示
Jawi Java Java
图H-1String类包含使用正则表达式来匹配、替换和拆分字符串的方法 图H-1String类包含使用正则表达式来匹配、替换和拆分字符串的方法

有两个重载的sp1it方法。split(regex) 方法使用匹配的分隔符将一个字符串拆分为子字符串。例如,以下语句
String[ ] tokens =“JavalHTML2Per 1”.split("\d");
将字符串"JavaHTML2Per 1"拆分为Java、HTML以及Per 1并且保存在tokens[0] ,tokens[1]以及tokens[2] 中。
在split(regex,1imit) 方法中,1imit参数确定模式匹配多少次。如果1imit<=0,split(regex,1imit)等同于sp1it(regex)。如果1imit>0,模式最多匹配1imit-1次。下面是一些示例:
在这里插入图片描述
*注意:*默认情况下,所有的量词符都是“贪婪”的。这意味着它们会尽可能匹配最多次。比如, 下面语句显示JR va a。因为第一个匹配成功的是aaa。
System .out.print1n(" Jaaavaa".rep1aceFirst(“a+”,“R”)) ;
可以通过在后面添加问号(?)来改变量词符的默认行为。量词符变为“不情愿”或者“惰性”的, 这意味着它将匹配尽可能少的次数。例如, 下面的语句显示JRaavaa, 因为第一个匹配成功的是a。
System .out.print1n(" Jaaavaa".rep1aceFirst(“a+?”,“R”)) ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值