Java中String类contains方法检测.、+、@符号失效问题求助
问题根因
核心问题出在replaceAll方法的使用上:
replaceAll的第一个参数是正则表达式,.在正则语法中是匹配任意单个字符的通配符,不是只代表字面量.字符。你调用replaceAll(".","")会直接把整个本地名(localName)的所有字符全部清空,不是你预期的只删除.。- 你观察到的
contains失效、+检测失效都是假象:前两个邮箱的本地名确实包含.,所以进入了if分支执行replaceAll,执行后本地名直接变成空字符串,后续自然找不到+,最终因为长度为0不会被加入集合,所以才出现你输出里前两个处理完都是空的情况。第三个邮箱本地名本身没有.,没进入replaceAll分支,所以处理正常。
修复方案
把替换.的代码换掉,二选一即可:
- 对
.做正则转义,适配replaceAll的规则:
localName = localName.replaceAll("\\.", "").trim();
- 更推荐直接使用不需要正则的
replace方法,该方法会替换所有匹配的字面量字符,更符合当前场景需求:
localName = localName.replace(".", "").trim();
其他优化建议
你代码中if(domainName.length() <= 1)分支只打印了0,没有终止当前邮箱的后续处理,无效域名仍会走到后续逻辑,可以补充continue跳出当前循环:
if(domainName.length() <= 1) { System.out.println(0); continue; }
修正后完整代码
public static void main(String[] args) { String[] emails = {"test.email+alex@leetcode.com","test.e.mail+bob.cathy@leetcode.com","testemail+david@lee.tcode.com"}; if(emails == null || emails.length == 0) { System.out.println(0); return; } HashSet<String> emailsSet = new HashSet<>(); for(int i = 0; i < emails.length; i++) { int splitIndex = emails[i].indexOf("@"); if(splitIndex <= 0) { continue; } String localName = emails[i].substring(0,splitIndex).trim(); String domainName = emails[i].substring(splitIndex).trim(); if(domainName.length() <= 1) { continue; } // 替换本地名中的. localName = localName.replace(".", "").trim(); // 截取+之前的部分 int plusIndex = localName.indexOf("+"); if(plusIndex >= 0) { localName = localName.substring(0, plusIndex).trim(); } if(localName.length() > 0) { emailsSet.add(localName + domainName); } } System.out.println(emailsSet.size()); }
修正后输出的集合大小为2,因为前两个邮箱处理后本地名都是testemail,域名都是@leetcode.com,会被HashSet去重,加上第三个的testemail@lee.tcode.com,最终集合大小是2。
内容的提问来源于stack exchange,提问作者Shreyasi Chakraborty
相关产品推荐
相关产品推荐

