Regex学习笔记
系统学习 Regex 0 422

基础语法备忘

非贪婪模式

在量词后添加?, 例如{m,n}?+?

组相关

  • 组: (balabala)
  • 引用组: \1, \2
  • 非捕获组: (?:balabala)

多匹配

  • 方括号[]: 字面层面的同时匹配
  • 竖线|:表达式层面的同时匹配

特殊字符

  • \w: 字母、数字和下划线
  • \W: 匹配除字母、数字和下划线之外的字符
  • \d: 仅用来匹配数字
  • \D: 匹配除数字之外的字符
  • \s: 仅匹配空白字符
  • \S: 匹配除空白符之外的字符

零宽断言

  • 正向先行断言(?=): \d+(?=PM), 匹配后面有PM的数值
  • 负向先行断言(?!)
  • 正向后行断言(?<=)
  • 负向后行断言(?<!)

标记位(模式)

标志位决定表达式是否将文本视作单独的行处理,是否区分大小写,或者是否查找所有匹配项。

  • 全局标记g: 如果不启用全局标志,表达式只会匹配第一个匹配项
  • 多行标记m: 如果我们使用了多行标志,它就会单独处理每一行(默认视作一行)
  • 忽略大小写标记i

实际运用

Python版本

参考文档

使用方法

需要先导入re:

  1. re.match
    # 更改号码格式
    match = re.match(r'^(\d{3})\-(\d{4})-(\d{4})$', '010-1234-5678')
    result = "".join(match.groups())
    print(result)
    # --------------------
    # 01012345678
  2. re.search
    pattern = r"hello"
    text = "hello world"
    match_search = re.search(pattern, text)
  3. re.compile, re.findall
    re_telephone = re.compile(r'[a-z]{3}',re.M|re.I)
    re_telephone.findall('abc\naDd')
    # --------------------
    # ['abc', 'aDd'] 
  4. re.split
    # 空格分割
    re.split(r'\s+', 'a b   c')
    # --------------------
    # ['a', 'b', 'c']
  5. re.sub
    re.sub(r'(?<=password: )(\w{6,8})','******', 'password: 1234asdw')
    # --------------------
    # 'password: ******'

JavaScript版本

参考文档

使用方法

可以结合RegExp使用: 【需要转义】

let re = new RegExp("\\d+");

  1. test: 检索字符串中是否存在匹配的模式。它返回 true 或 false。【相当于Python中的match
    let re = /ab+c/;
    let str = "ac abc abbbc abbbbbc";
    let result = re.test(str);  // true
  2. match: 检索字符串中的所有匹配。它返回一个数组,其中存储了与正则表达式相匹配的所有字符串。【相当于Python中的findall
    let re = /ab+c/g;
    let str = "ac abc abbbc abbbbbc";
    let result = str.match(re);  // ["abc", "abbbc", "abbbbbc"]
  3. search: 检索与正则表达式相匹配的值。它返回第一个匹配的起始位置。【相当于Python中的search
    let re = /ab+c/;
    let str = "ac abc abbbc abbbbbc";
    let result = str.search(re);  // 2
  4. replace: 检索与正则表达式相匹配的值,并替换成指定的值。它返回被替换后的字符串。
    let re = /ab+c/g;
    let str = "ac abc abbbc abbbbbc";
    let result = str.replace(re, "X");  // "ac X X X"

Java版本

参考文档

使用方法

调用方法:

// 第一种
Pattern p = Pattern.compile(".s", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("aS");  
boolean s1 = m.matches();  
System.out.println(s1);   // Outputs: true
// 第二种
boolean s2 = Pattern.compile("[0-9]+").matcher("123").matches();  
System.out.println(s2);   // Outputs: true
// 第三种
boolean s3 = Pattern.matches(".s", "XXXX");  
System.out.println(s3);   // Outputs: false
// 第四种
String regex = "20\\d\\d";
System.out.println("2019".matches(regex)); // true
  1. matches
    String input = "Hello, World!";
    String regex = "Hello.*";
    
    boolean isMatch = input.matches(regex);
    System.out.println(isMatch);  // 输出:true
  2. find
    // 实现findAll
    String input = "The quick brown fox jumps over the lazy dog.";
    String regex = "\\b(\\w{5})\\b";  // 匹配长度为5的单词
    
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(input);
    
    while (matcher.find()) {
        String match = matcher.group(); // 等价于matcher.group(0)
        System.out.println(match);
        System.out.println(matcher.group(1));
    }
  3. split
    String input = "One,Two,Three,Four,Five";
    String regex = ",";  // 以逗号为分隔符
    
    String[] parts = input.split(regex);
    System.out.println(Arrays.toString(parts));
  4. replaceAll【注意,replace不支持regex】
    String input = "Hello, World!";
    String regex = "o";
    String replacement = "*";
    
    String replacedString = input.replaceAll(regex, replacement);
    System.out.println(replacedString);  // 输出:Hell*, W*rld!
编写
预览