常见的正则表达
字符不重复
如果你想匹配一个长度为 3 的字符串,并且这三个字符不能重复,可以使用以下正则表达式:
(\w)(?!\1)(\w)(?!\1|\2)(\w)
解释
(\w):匹配任意一个单词字符(字母、数字或下划线),并将其捕获为第一个组。(?!\1)(\w):匹配另一个单词字符,并确保它不等于第一个捕获的字符。这是通过(?!\1)实现的,即零宽断言,表示不匹配与第一个捕获组相同的字符。(?!\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));
}
}
}
代码说明
-
正则表达式
(?=(abc|bcd)):- 这里使用了正向零宽断言
(?=...),这表示匹配位置而不消耗字符,因此可以实现对重叠匹配的查找。 - 在断言中匹配的部分会重叠扫描,这样在找到第一个
"abc"后,扫描会从第二个字符开始,允许找到"bcd"。
- 这里使用了正向零宽断言
-
matcher.group(1):- 由于我们在正则表达式中使用了捕获组
(abc|bcd),group(1)返回实际匹配到的部分。
- 由于我们在正则表达式中使用了捕获组
这种方法通过零宽断言和控制匹配起始位置的方式,实现了对重叠的字符串进行匹配。