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

Java中如何用replaceAll()保留指定序列及消息JSON处理?

解决你的Java字符串处理与JSON消息构建问题

Hey,我来帮你搞定这两个问题——先是replaceAll()的用法误区,再修复你JSON消息里的颜色提取和链接逻辑问题。

一、用replaceAll()保留指定序列的正确姿势

你说输入"搂eTeste"时想得到"搂e"但没成功,问题出在正则表达式的写法上。其实你需要精准捕获要保留的内容,然后把其他部分替换掉。

如果你的需求是保留字符串开头的"搂"+紧跟的一个字符(比如示例里的"搂e"),可以这么写:

String input = "搂eTeste";
String result = input.replaceAll("(搂.).*", "$1");
System.out.println(result); // 输出: 搂e

这里的(搂.)是捕获组,专门抓"搂"和它后面的第一个字符;.*匹配剩下的所有内容;最后用$1把捕获到的内容放回去,就只剩你要的部分了。

要是你需要保留所有"搂[合法颜色/格式字符]"的序列(比如"搂a搂BTest"要留下"搂a搂B"),就用反向匹配,把非目标内容删掉:

String input = "搂a搂BTest";
// 替换所有不是"搂"或合法颜色字符的内容
String result = input.replaceAll("[^搂0-9A-Fa-fK-Rk-r]", "");
System.out.println(result); // 输出: 搂a搂B

注意这里正则不能加多余的括号,[^搂0-9A-Fa-fK-Rk-r]就是匹配所有不属于目标集合的字符,替换成空就搞定了。


二、修复JSON消息的颜色提取与链接逻辑

你的代码里颜色提取的正则写错了,还有字符串判断和拼接时机也有点乱,我给你改好了,关键地方都标了注释:

String[] args = message.split(" ");
StringBuilder sb = new StringBuilder();
// 跟踪当前生效的颜色代码,初始为空
String currentColor = "";

for (int i = 0; i < args.length; i++) {
    String token = args[i];
    // 提取当前token里的颜色代码——取最后一个,因为后面的颜色会覆盖前面的
    Matcher colorMatcher = Pattern.compile("搂[0-9A-Fa-fK-Rk-r]").matcher(token);
    String tokenColor = "";
    while (colorMatcher.find()) {
        tokenColor = colorMatcher.group(); // 每次找到就更新,最后得到的是最后一个颜色
    }

    // 如果当前token有颜色,更新全局的当前颜色
    if (!tokenColor.isEmpty()) {
        currentColor = tokenColor;
    }

    // 去掉token里的颜色代码,判断是不是链接
    String cleanToken = token.replaceAll("搂[0-9A-Fa-fK-Rk-r]", "");
    boolean isLink = cleanToken.startsWith("http://") || cleanToken.startsWith("https://");

    if (isLink) {
        // 先把之前攒的普通文本加到JSON里(如果有的话)
        if (sb.length() > 0) {
            JSONObject textObj = new JSONObject();
            textObj.put("text", sb.toString().trim());
            jmessage.add(textObj);
            sb.setLength(0); // 清空,准备下一段
        }

        // 构建链接的JSON对象
        JSONObject linkObj = new JSONObject();
        JSONObject clickEvent = new JSONObject();
        clickEvent.put("action", "open_url");
        clickEvent.put("value", cleanToken);

        // 链接文本带上当前生效的颜色
        linkObj.put("text", currentColor + token);
        linkObj.put("clickEvent", clickEvent);
        jmessage.add(linkObj);
    } else {
        // 非链接文本,攒到StringBuilder里
        if (sb.length() == 0 && !currentColor.isEmpty()) {
            sb.append(currentColor); // 第一个非链接文本,先加当前颜色
        }
        sb.append(token).append(" ");
    }

    // 处理最后一个非链接的token,避免留多余空格
    if (i == args.length - 1 && !isLink && sb.length() > 0) {
        JSONObject textObj = new JSONObject();
        textObj.put("text", sb.toString().trim());
        jmessage.add(textObj);
    }
}

主要改了这些地方:

  1. 颜色提取更靠谱:

    • 用Matcher遍历token里的所有颜色代码,取最后一个作为当前生效的颜色(毕竟消息里后面的颜色会覆盖前面的);
    • 删掉了你原来写错的replaceAll("[^(搂[0-9A-Fa-fK-Rk-r])]", "")——这个正则里的括号会被当成普通字符,根本没法正确提取颜色,用Matcher就稳多了。
  2. 去掉没用的null判断:

    • StringBuilder.toString()永远不会返回null,所以sb.toString() != null完全是多余的,直接用sb.length() > 0判断有没有内容就行。
  3. 文本攒放和JSON添加时机理顺了:

    • 遇到链接时,先把之前攒的普通文本加到JSON,再单独处理链接;
    • 最后一个非链接文本单独处理,避免结尾留多余空格;
    • 用currentColor变量跟踪全局颜色,确保每个新文本/链接都能继承正确的颜色。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:27:32