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

Java中使用contains()匹配***时误匹配*的问题求助

按星号数量匹配拼接字符串的Java解决方案

问题根源

你用contains("***")的思路本身就不对——这个方法只检查字符串里有没有连续三个星号的子串,但你的需求是精准匹配开头/结尾有指定数量星号的行,不是只要有三个星号就行。比如第二个输入里的*Lorem...根本不含***,但如果逻辑写错(比如误判成只要有星号就匹配),就会把它选进来,导致输出错误。

正确实现思路

要完成按星号数量拼接,核心是精准获取每行开头/结尾的星号数量,再按数量匹配对应行:

  1. 提取第一组输入目标行末尾的星号数量
  2. 在第二组输入中筛选开头星号数量匹配的行
  3. 将两组对应内容拼接输出

示例代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 16:37:15