java正则表达式基础 关于特殊字符、捕获组和非捕获匹配

JAVA正则表达式

我个人认为正则表达式是很好用很强大的,在编写程序中很多地方都用的到,这里有一些我学习的基础理解和大家分享,欢迎一起讨论。
正则表达式是一种用来表达语法规则的字符串,是一种字符串匹配的模式,用于解析字符串。由普通字符和元字符构成。普通字符指的是字母、中文、数字等,元字符指的是特殊字符(用一个或一组代替一个或多个字符的字符)。

常用的特殊字符:

符号含义
\\在正则表达式里具有特殊意义,将下一字符标记为特殊字符或原义字符,例如\d表示数字,\\表示一个\。
^匹配字符串的开始
$匹配字符串的结束
.匹配除换行符之外的任何字符
( )表示一个子表达式的开始和结束
x|yx和y可以是普通字符或者表达式。表示字符串要么符合x要么符合y。
[xyz]表示匹配xyz中的任意一个字符
[^xyz]^在[ ]中表示不匹配xyz中的任意一个字符
[a-z]数值范围,表示a到z的任意一个字符
[0-9]数值范围,表示0到9的任意一个字符
?限定符,表示零次或一次匹配前面的字符或者表达式
+限定符,表示至少一次匹配前面的字符或者表达式
*限定符,表示零次或多次匹配前面的字符或者表达式
{n}限定符,表示至少n次匹配前面的字符或者表达式
{n,}限定符,表示至少n次匹配前面的字符或者表达式,等效于{n}
{n,m}限定符,表示至少n次,最多m次匹配前面的字符或者表达式
\b匹配一个字边界,例如o\b匹配mo中的o,但不匹配mom中的o
\B非字边界匹配,例如o\b匹配mom中的o,但不匹配mo中的o
\n匹配换行符
\r匹配回车符
\s匹配任何空白字符
\S匹配任何非空白字符
\w匹配任何字类字符(字母、数字、下划线)
\W匹配任何非字母、数字字符
\d匹配任何数字字符
\D匹配任何非数字字符

java中的正则表达式特殊地方:

在其他语言的正则表达式中,一个\就具有特殊意义,两个\表示一个普通的\。而在java的正则中,两个\表示后面的字符有特殊意义,而表示一个普通的\就需要四个\。

捕获组:

捕获组是通过从左至右计算其开括号来编号,分组解析。例如在表达式((A)(B(C)))可以根据括号解析为4个组
1.((A)( B( C ) ) )
2.(A)
3.(B ( C ))
4.( C )
每一组都指一个子表达式

非捕获匹配:

(?:pattern):
表示未捕获分组,字符串依然需要匹配该表达式,但是该表达式的值不会存储,只是可以供其他表达式使用,例如
(industr(y|ies)) 匹配 industry ,我们会得到两组,一个industry 和一个y。
因为我们要一个单的y或者ies没有意义,所以需要(?:)
(industr(?:y|ies)) 匹配 industry ,我们只会得到industry ,而这是我们想要的。
我认为这个语法很多情况下都会遇到,所以需要掌握。
(?=pattern) 正向肯定预查
以 xxx(?=pattern)为例,就是捕获以pattern结尾的内容xxx
(?!pattern) 正向否定预查:
以 xxx(?!pattern)为例,就是捕获不以pattern结尾的内容xxx
(?<=pattern) 反向肯定预查:
以(?<=pattern)xxx为例,就是捕获以pattern开头的内容xxx。
(?<!pattern) 反向否定预查:
以(?<!pattern)xxx为例,就是捕获不以pattern开头的内容xxx。

java实例代码:

//取字符串中的年月
//title-标题  patten-正则表达式   
String title="2016年5月的太原售电量";
        String patten="(\\d{4}年)(\\d{1,2}月)";
        //用正则创建Pattern对象
        Pattern compile = Pattern.compile(patten);
        //用Pattern对象匹配写好的正则返回Matcher对象
        Matcher matcher = compile.matcher(title);
        //循环取Matcher对象匹配到的组
        while (matcher.find()){
            //groups  匹配到多少组
            int groups = matcher.groupCount();
            System.out.println(groups);
            //循环输出每组表达式匹配的字符串
            for (int i = 1; i <=groups ; i++) {
                String group = matcher.group(i);
                System.out.println(group);
            }
        }

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值