正则表达式

下面讲一下JS正则表达式。

正则表达式构造方式:

1.第一种使用字面量,推荐

const regex = /abc/ig

格式就是以/开始和结束的字面常量,结束后面可以跟参数:

  • i:忽略大小写;
  • g:全字符串匹配,不会匹配一个之后就结束;

2.第二种使用构造函数来创建正则表达式(es6新特性)

const regex = newRegExp("abc","ig");

普通字符

指使用的字母、数字、下划线和一些符号等;

元字符(拥有特殊含义)

如果想要匹配元字符本身,则需要使用/进行转义。

  1. 锚字符^,$,定位,不匹配文本:

    • ^:字符串开头;
    • $:字符串结尾;
    /^abc123/.test("abc") //true
    
    /abc123$/.test("123") //true
    
    /^abc123$/.test("abc123")//true,只能匹配abc123这样的字符串,其前面和后面都不能有字符
    
  2. 字符类[]

    可以使用[]来表示一个字符集合,只要满足其中一个就算匹配:

    /a[bcd]e/   abe,ace,ade✔
    

    如果使用相同类型且连续情况下,可以使用-字符:

    [a-z0-9A-Z]
    

    还可以使用^字符取集合类的补集:

    [^0-9] //非数字类
    
  3. 预定义字符类

    .:匹配任意个单字符;

    \d:数字[0-9]

    \D:非数字[^0-9]

    \w:单词字符 [A-Za-z0-9_]

    \W:非单词字符

    \s:空白字符(空格、制表符、换行)

    \S:非空白字符

    /\d/.test("6");  //true
    /\w/.test("_");  //true
    
  4. 量词(控制前面字符出现次数)

    • *:≥0 次(0 次、1 次、多次)

    • +:≥1 次(至少出现 1 次)

    • ?:0 次 或 1 次(可有可无)

    • {n}:恰好 n 次

    • {n,}:至少 n 次

    • {n,m}:n ~ m 次

    默认贪婪匹配;量词后加?开启非贪婪:+? *?

  5. 分组()

    1. 把多个字符当成整体
    2. 捕获组,匹配内容可以提取
    const reg = /(ab)+/;
    reg.test("ababab"); //true ab整体重复多次
    
  6. 选择符|

    /a|b/.test("a"); //匹配a或者b
    /(abc|123)/.test("123");
    
  7. 常用正则方法

    1. reg.test(str):返回布尔值,判断是否能匹配;
    2. reg.exec(str):返回匹配结果数组,捕获内容存储在数组中,无匹配返回null,匹配成功就停止;
    3. 字符串方法配合正则:
      • str.match(reg)获取匹配成功的子串;
      • str.replace(reg,新内容)用新内容替换所有被匹配成功的地方;

正则表达式练习

1.手机号的正则表达式:

/^1[3456789]\d{9}$/

2.邮箱正则表达式:

/^[0-9a-zA-Z_-]+@[0-9a-zA-Z_-]+(\.[a-zA-Z0-9_-]+)$/

Java中使用正则表达式规则差不多:

package com.alij.jdk8_quick_stater.regex;

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

public class regexDemo1 {
    public static void main(String[] args) {
        String regex = "1[3456789]\\d{9}";
        //预编译,提升性能,适合于多次查找正则表达式
        Pattern pattern = Pattern.compile(regex);

        String content = "phone1:13542835693,phone2:14787649865";
        Matcher matcher = pattern.matcher(content);
        while(matcher.find()){
            String phone = matcher.group();
            System.out.println(phone);
        }
    }
}

Matcher 关键方法区分(极易混淆)

  1. matches()
    全部字符串严格匹配,等同于正则加上 ^正则$
matcher.matches();
  1. find()
    查找字符串中是否存在子串满足规则(搜索包含匹配),循环获取多个结果

  2. group() 捕获组

  • group() = group(0):获取整体匹配内容
  • group(1):获取第1个括号捕获内容,依次类推

捕获组示例:

Pattern p = Pattern.compile("(\\d{4})-(\\d{2})");
Matcher m = p.matcher("2026-07");
if(m.find()){
    System.out.println(m.group(0)); //2026-07
    System.out.println(m.group(1)); //2026
    System.out.println(m.group(2)); //07
}

正则元字符【和JS基本一致,注意Java转义】
通用规则和JS正则相同:
^ $ . * + ? | () [] {} \d \w \s

重点提醒:
✅ JS写法:\d
✅ Java字符串:"\\d"
✅ 如果要匹配字面量 \,Java需要写 "\\\\"

示例:匹配小数

// 匹配 3.14  . 需要转义 \\.
Pattern.compile("\\d+\\.\\d+");

Java独有:Pattern 修饰符(等价JS修饰符)
编译时传入标志位

// Pattern.CASE_INSENSITIVE = 忽略大小写(等价JS i)
Pattern pattern = Pattern.compile("abc", Pattern.CASE_INSENSITIVE);

常用标志:

  • Pattern.CASE_INSENSITIVE 忽略大小写
  • Pattern.MULTILINE 多行模式 ^$匹配每行(等价m)
  • Pattern.DOTALL . 匹配换行符(等价JS s修饰符)
posted @ 2026-08-03 22:45  alij  阅读(4)  评论(0)    收藏  举报