Java 正则表达式

Java 正则表达式

Java 的匹配默认为贪婪匹配,尽可能多的去匹配。

匹配规则

规则 作用 示例 示例说明
[] 可接收的字符列表 [efg] 可接收e、f、g中任意一个字符
[^] 不接收的字符列表 [^efg] 除e、f、g之外的任意一个字符
- 连字符 A-Z 任意一个大写字母
. 匹配除\n为的任意字符 a…b 以a开头,b结尾,中间包括2个任意字符的长度为4的字符串
\\d 匹配单个数字字符 \\d{3}\\d? 匹配 3 个或 4 个数字的字符串
\\D 匹配单个非数字字符 \\D(\\d)* 以单个非数字开头, 后接任意个数的数字字符串
\\w 匹配单个数字、大小写字母的字符以及下划线
\\W \\w 相反 \\W+ 以至少1个非数字字母开头的字符串
\\s 匹配单个空白符
\\S 匹配非空白符
(?i) 符号之后的内容都不区分大小写了,除非用括号指定范围
^ 指定起始字符 1+[a-z]* 表示以至少一个数字开头, 后接任意个数的小写字母组成的字符串
$ 指定结束字符 [a-z]+$ 表示以至少一个小写字母结尾的字符串
\\b 匹配目标字符串的边界。这里的边界指的是字符串之后跟空白字符为边界,或者就是整个字符串的最后
\\B 匹配目标字符串的非边界
? 单独使用,匹配0或1个出现的前一个表达式;与其他匹配符号一起使用,表示非贪婪匹配
* 匹配0个或多个出现的前一个表达式。 ba*$ 以 b 或 ba…结尾的字符串
+ 匹配1个或多个出现的前一个表达式 ^a+ 开头至少有 1 个 a 的字符串
{n} 匹配正好n次出现的前一个表达式
{n,} 匹配至少n次出现的前一个表达式
{n,m} 匹配至少n次且不超过m次出现的前一个表达式
| 匹配两个或多个表达式之一

初体验

使用 Java 正则表达式匹配4个连在一起的阿拉伯数字。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 使用正则表达式匹配4个连在一起的阿拉伯数字。
 */
public class RegExp01 {
   
    public static void main(String[] args) {
   
        String content = "1889xcj+dsb&c1198cdj==fhs7863xbc-ndb34ms_ndc3dh%fjc";

        // 目标:匹配4个连在一起的数字
        String regStr = "\\d\\d\\d\\d";

        // 创建模式匹配对象
        Pattern pattern = Pattern.compile(regStr);
        
        // 创建匹配器
        Matcher matcher = pattern.matcher(content);
        
        while (matcher.find()) {
   
            System.out.println("找到:" + matcher.group(0));
        }
    }
}

分析 matcher.find()

以上面给出的代码分析:

  1. 根据指定的规则,定位满足规则的 子字符串,比如: 1889。

  2. 找到后,将 子字符串 开始的索引记录到 matcher 对象的 groups 属性中(int[] groups)。

    groups[0] = 0, 把该子字符串的 结束索引+1 的值记录到 group[1] = 4,

    同时记录 oldLast 的值为 子字符串结束索引+1, 即 4,下次执行 find() 时, 就从 4 开始匹配。

  3. matcher.group(0)

    根据 groups[0]group[1] 记录的位置, 从 content 开始截取子字符串返回。

    源码

    public String group(int group) {
         
        if (first < 0)
            throw new IllegalStateException("No match found");
        if (group < 0 || group > groupCount())
            throw new IndexOutOfBoundsException("No group " + group);
        if ((groups[group*2] == -1) || 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值