Java正则反向引用失效问题及星号匹配任务求解
问题一:Java中正则反向引用的正确写法
在Java字符串里,反斜杠\属于转义字符,因此正则表达式里的反向引用\1必须写成\\1,才能被正确传递给正则引擎。你原本的正则字符串"(a+)B\1"会被Java解析为"(a+)B"加上非法转义后的无效字符,导致正则引擎无法识别反向引用规则。
正确的正则写法如下,此时能成功匹配"aaaBaaa":
String regex = "(a+)B\\1";
这里捕获组(a+)会匹配"aaa",\\1会精准引用该捕获结果,匹配后续的"aaa",从而完成整个字符串的匹配。
问题二:实现
sameStarChar方法 你的现有代码存在两个核心问题:
- 反向引用未转义:Java中
\1必须写成\\1; - 逻辑逻辑错误:
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
相关产品推荐
相关产品推荐

