常见的正则表达

175 阅读2分钟

常见的正则表达

字符不重复

如果你想匹配一个长度为 3 的字符串,并且这三个字符不能重复,可以使用以下正则表达式:

(\w)(?!\1)(\w)(?!\1|\2)(\w)

解释

  1. (\w) :匹配任意一个单词字符(字母、数字或下划线),并将其捕获为第一个组。
  2. (?!\1)(\w) :匹配另一个单词字符,并确保它不等于第一个捕获的字符。这是通过 (?!\1) 实现的,即零宽断言,表示不匹配与第一个捕获组相同的字符。
  3. (?!\1|\2)(\w) :匹配第三个单词字符,并确保它不等于第一个或第二个捕获的字符。
可重复匹配

如果需要在字符串中找到多个重叠的匹配项,比如在 "abcde" 中匹配到 "abc""bcd",可以通过调整正则匹配逻辑来实现。默认情况下,Java 的 Matcher 类并不会查找重叠匹配,但我们可以使用 Matcher 类的 find 方法结合手动控制搜索起始位置来实现。

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

public class OverlappingMatchExample {
    public static void main(String[] args) {
        // 要匹配的字符串
        String text = "abcde";

        // 定义正则表达式
        String regex = "(?=(abc|bcd))";

        // 创建 Pattern 对象
        Pattern pattern = Pattern.compile(regex);

        // 创建 Matcher 对象
        Matcher matcher = pattern.matcher(text);

        // 手动查找重叠的匹配项
        while (matcher.find()) {
            System.out.println("Found a match: " + matcher.group(1));
        }
    }
}

代码说明

  1. 正则表达式 (?=(abc|bcd)) :

    • 这里使用了正向零宽断言 (?=...),这表示匹配位置而不消耗字符,因此可以实现对重叠匹配的查找。
    • 在断言中匹配的部分会重叠扫描,这样在找到第一个 "abc" 后,扫描会从第二个字符开始,允许找到 "bcd"
  2. matcher.group(1) :

    • 由于我们在正则表达式中使用了捕获组 (abc|bcd)group(1) 返回实际匹配到的部分。

这种方法通过零宽断言和控制匹配起始位置的方式,实现了对重叠的字符串进行匹配。