Java中使用contains()匹配***时误匹配*的问题求助
按星号数量匹配拼接字符串的Java解决方案
问题根源
你用contains("***")的思路本身就不对——这个方法只检查字符串里有没有连续三个星号的子串,但你的需求是精准匹配开头/结尾有指定数量星号的行,不是只要有三个星号就行。比如第二个输入里的*Lorem...根本不含***,但如果逻辑写错(比如误判成只要有星号就匹配),就会把它选进来,导致输出错误。
正确实现思路
要完成按星号数量拼接,核心是精准获取每行开头/结尾的星号数量,再按数量匹配对应行:
- 提取第一组输入目标行末尾的星号数量
- 在第二组输入中筛选开头星号数量匹配的行
- 将两组对应内容拼接输出
示例代码
import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class StarLineMatcher { public static void main(String[] args) { // 第一组输入内容 List<String> group1 = List.of( "Lorem ipsum dolor sit amet, ", "consectetur adipiscing elit.", "Aliquam imperdiet iaculis ex***" ); // 第二组输入内容 List<String> group2 = List.of( "*Lorem ipsum dolor sit amet, ", "**consectetur adipiscing elit. ", "***Aliquam imperdiet iaculis ex" ); // 获取第一组最后一行的末尾星号数量(匹配你的示例需求) int targetStarCount = 0; Pattern endStarRegex = Pattern.compile("\\*+$"); Matcher endMatcher = endStarRegex.matcher(group1.get(group1.size() - 1)); if (endMatcher.find()) { targetStarCount = endMatcher.group().length(); } // 拼接输出:先写入第一组所有行,再追加第二组中匹配的行 StringBuilder result = new StringBuilder(); for (String line : group1) { result.append(line).append("\n"); } Pattern startStarRegex = Pattern.compile("^\\*+"); for (String line : group2) { Matcher startMatcher = startStarRegex.matcher(line); if (startMatcher.find() && startMatcher.group().length() == targetStarCount) { result.append(line).append("\n"); break; // 按示例需求找到匹配项后停止 } } System.out.print(result); } }
代码说明
\\*+$正则:精准匹配行末尾的连续星号,通过group().length()获取星号数量^\\*+正则:精准匹配行开头的连续星号,同样获取数量用于匹配- 完全规避了
contains()的模糊判断,只按星号数量和位置精准筛选行
为什么contains()满足不了需求?
contains("***")只关心字符串中是否存在连续三个星号的子串,不管星号在开头、中间还是结尾。比如某行中间出现abc***def,contains()也会返回true,但这显然不是你需要的匹配规则。如果不小心把判断条件写成contains("*"),那只要带星号的行都会被错误选中,直接导致输出不符合预期。
内容的提问来源于stack exchange,提问作者randomplant
相关产品推荐
相关产品推荐

