Java正则表达式理解

正则表达式(regular expression, 简写为regex)是一个字符串,用来描述匹配一个字符串集合的模式。

  • 理解正则表达式-----匹配字符串

在String类中有matches方法和equals方法用于比较字符串,而matches

方法的功能更强大,它不仅可以匹配固定的字符串,还可以匹配同一模式的字符串集

Eg.  “Java is fun ".matches("Java.*")     true

"Java is cool ".matches("Java.*")   true

"Java is powerful ".matches("Java.*")   true

以上的语句中"Java.*" 是一个正则表达式。他描述了一个字符串模式,即以“Java"开始,后面跟着n个字符串。 这里的子字符串 ".*"匹配0活捉多个任意字符。

  • 正则表达式语法

正则表达式由字面值字符和特殊符号组成。

常用的正则表达式:

(图源《Java语言程序设计与数据结构》附录)

注意:单词字符是任何的字母,数字或者下划线字符。所以\w匹配任何类字符,包括下划线。与[^A-Aa-z0-9_]等效。

注意:表中后面六个条目*、+、?、{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}。

警告:不要在重复量词符中使用空白。例如,A{3,6} 不能写成逗号后面有一个空白符的
A{3,6}。
注意:可以使用括号来将模式进行分组。例如,(ab){3} 匹配ababab,但是ab{3}匹配
abbb。

示例

社会安全号的模式是xxx-xx-xxx,其中x是一位数字。其正则表达式可以描述为[\\d]{3}-[\\d]{2}-[\\d]{4}     例如:“111-22-3333”.matches("[\\d]{3}-[\\d]{2}-[\\d]{4}") return true.

思考:像这样的案例,正则表达式可以运用于用户登录某系统时,账号/密码的输入格式管理。
 

  • 替换和拆分字符串

        如果字符串匹配正则表达式,String 类的matches方法返回true。String 类也包含
repalceAll、replaceFirst 和split方法,用于替换和拆分字符串。 replaceAll方法替换所有匹配的子字符串,replaceFirst 方法替换第一个匹配的子字符串。例如:

System.out.println("Java Java Java".replaceAll("v\\w'', "wi"));   显示  Jawi Jawi Jawi
System.out.println("Java Java Java".replaceFirst("v\\w'', "wi")); 显示 Jawi Java Java

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值