You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java正则反向引用失效问题及星号匹配任务求解

问题一:Java中正则反向引用的正确写法

在Java字符串里,反斜杠\属于转义字符,因此正则表达式里的反向引用\1必须写成\\1,才能被正确传递给正则引擎。你原本的正则字符串"(a+)B\1"会被Java解析为"(a+)B"加上非法转义后的无效字符,导致正则引擎无法识别反向引用规则。

正确的正则写法如下,此时能成功匹配"aaaBaaa":

String regex = "(a+)B\\1";

这里捕获组(a+)会匹配"aaa",\\1会精准引用该捕获结果,匹配后续的"aaa",从而完成整个字符串的匹配。

问题二:实现sameStarChar方法

你的现有代码存在两个核心问题:

  1. 反向引用未转义:Java中\1必须写成\\1;
  2. 逻辑逻辑错误:matcher.find()只要找到任意一个匹配项就返回true,但任务要求所有前后都有字符的*必须满足前后字符相同,正确逻辑应为:若存在任意一个*前后都有字符且字符不同,则返回false,否则返回true。

正确实现方案

方案一:正则表达式方式

通过正则匹配不符合要求的场景:即存在*前后都有字符且字符不同的情况。若找到该场景则返回false,否则返回true。

public boolean sameStarChar(String str) {
    // 匹配规则:前面有任意字符,接着*,后面有字符且与前面字符不同
    java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("(.)\\*(?!\\1).");
    java.util.regex.Matcher matcher = pattern.matcher(str);
    // 找不到不符合规则的情况则返回true
    return !matcher.find();
}

方案二:遍历字符串(非正则方式)

直接遍历字符串,逐个检查每个*的前后字符:

public boolean sameStarChar(String str) {
    for (int i = 1; i < str.length() - 1; i++) {
        if (str.charAt(i) == '*') {
            char before = str.charAt(i - 1);
            char after = str.charAt(i + 1);
            if (before != after) {
                return false;
            }
        }
    }
    return true;
}

测试验证

  • sameStarChar("xy*yzz"):*前后为y和y,符合要求,返回true;
  • sameStarChar("xy*zzz"):*前后为y和z,不符合要求,返回false;
  • sameStarChar("*xa*az"):开头*无需检查,第二个*前后为a和a,符合要求,返回true;

内容的提问来源于stack exchange,提问作者Lazaruss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:31:09