# **KQCodeUtils**
因为原本框架中已经存在一个`CQCodeUtil`,因此为了避免混淆,也遵循一定的命名规则,我将当前的CQ码工具类命名为了`KQCodeUtils`。此类同样为`单例`对象,可通过常量`INSTANCE`或静态方法`getInstance()`获取实例。
在列举它的方法之前,这里先展示一些实例代码以供参考。以下示例使用`java`语言进行展示。
## **注意**
`KQCodeUtils`的内容会随着版本的更新逐步增加或变更。如果出现实际代码与文档不符的情况,以实际代码与注释为准。
## **部分示例**
- **创建CQ码字符串**
```java
// 获取utils实例
final KQCodeUtils utils = KQCodeUtils.getInstance();
// toCq就是字符串
// 可以直接用 key=value的格式
final String atString1 = utils.toCq("at", "qq=123", "name=jack");
// 第二个boolean类型的参数代表是否要对 = 后面的值进行转义。
final String atString2 = utils.toCq("at", false, "qq=123", "name=jack");
// 可以使用map的格式
final HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("qq", 123456789);
paramMap.put("name", "jack");
final String atString2 = utils.toCq("at", paramMap);
// 可以使用Pair。Pair是kotlin中的 "qq" to 123456789
// 这里只是借java做个展示,一般kotlin里才这么用
final String atString3 = utils.toCq("at", new Pair<>("qq", 123456789), new Pair<>("name", "jack"));
// 可以啥也没有
final String atString4= utils.toCq("at");
System.out.println(atString1);
System.out.println(atString2);
System.out.println(atString3);
System.out.println(atString4);
```
>[success] 输出结果为:
```
[CQ:at,qq=123,name=jack]
[CQ:at,qq=123456789,name=jack]
[CQ:at,qq=123456789,name=jack]
[CQ:at]
```
- **获取KQCode实例**
```java
// 获取utils实例
final KQCodeUtils utils = KQCodeUtils.getInstance();
// toKq就是KQCode
// 可以直接用 key=value的格式
final KQCode atKq1 = utils.toKq("at", "qq=123", "name=jack");
// 可以使用map的格式
final HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("qq", 123456789);
paramMap.put("name", "jack");
final KQCode atKq2 = utils.toKq("at", paramMap);
// 可以用Pair。一般kotlin使用此方法,例如 "qq" to 123456789
// @since v1.5.1-1.15
final KQCode atKq3 = utils.toKq("at", new Pair<>("qq", 123456789));
// 可以啥也没有
// @since v1.5.1-1.15
final KQCode atKq4 = utils.toKq("at");
System.out.println(atKq1);
System.out.println(atKq2);
System.out.println(atKq3);
System.out.println(atKq4);
```
>[success] 输出结果为:
```
[CQ:at,qq=123,name=jack]
[CQ:at,qq=123456789,name=jack]
[CQ:at,qq=123456789]
[CQ:at]
```
- **文本中获取CQ码**
```java
// 一段文字与cq码的混编字符串
String cqCodeText = "你好![CQ:at,qq=123456], [CQ:at,qq=666666], 这段话很长的。[CQ:image,file=http://forte.love:15520/img/r]";
// utils实例
final KQCodeUtils utils = KQCodeUtils.getInstance();
// getCq, 就是获取字符串中的CQ码字符串
// 无参数,代表获取第一个出现的CQ码
final String getCq1 = utils.getCq(cqCodeText);
// 获取索引为1的CQ码,即第二个CQ码
final String getCq2 = utils.getCq(cqCodeText, 1);
// 获取索引为0的image类型的CQ码
final String getCq3 = utils.getCq(cqCodeText, "image", 0);
// getCqIter, 就是获取多个CQ码字符串的迭代器。此处不做输出展示了。
utils.getCqIter(cqCodeText);
// getCqs, 获取多个CQ码,可指定类型。
final String[] getCq4 = utils.getCqs(cqCodeText, "at");
/*
如果想要将提取出来的CQ码作为KQCode实例获取,使用getKq相关的方法即可。不再做示例。
*/
System.out.println(getCq1);
System.out.println(getCq2);
System.out.println(getCq3);
System.out.println(Arrays.toString(getCq4));
```
>[success] 输出结果为:
```
[CQ:at,qq=123456]
[CQ:at,qq=666666]
[CQ:image,file=http://forte.love:15520/img/r]
[[CQ:at,qq=123456], [CQ:at,qq=666666]]
```
- **获取文本中CQ码的参数**
```java
// 一段文字与cq码的混编字符串
String cqCodeText = "你好![CQ:at,qq=123456], [CQ:at,qq=666666], 这段话很长的。[CQ:image,file=http://forte.love:15520/img/r]";
// utils实例
final KQCodeUtils utils = KQCodeUtils.getInstance();
// getParam,就是从文本中提取出来CQ码中的参数。
// 这个方法只能提取字符串,或者你可以直接从字符串中获取KQCode,并使用KQCode.get(...)方法。
// 相对于获取KQCode实例来获取参数,此方法直接操作字符串,更高效。
// 获取第一个CQ码的"qq"参数
final String getParam1 = utils.getParam(cqCodeText, "qq");
// 获取第一个at类型的CQ码的"qq"参数
final String getParam2 = utils.getParam(cqCodeText, "qq", "at");
// 获取索引为1的at类型的CQ码的"qq"参数
final String getParam3 = utils.getParam(cqCodeText, "qq", "at", 1);
// 获取索引为2的CQ码的"file"参数
final String getParam4 = utils.getParam(cqCodeText, "file", 2);
System.out.println(getParam1);
System.out.println(getParam2);
System.out.println(getParam3);
System.out.println(getParam4);
```
>[success] 输出结果为:
```
123456
123456
666666
http://forte.love:15520/img/r
```
- **移除文本中的CQ码**
```java
// 一段文字与cq码的混编字符串
String cqCodeText = "你好![CQ:at,qq=123456] 哈哈 [CQ:at,qq=666666] 这段话很长的。[CQ:image,file=http://forte.love:15520/img/r]";
// utils实例
final KQCodeUtils utils = KQCodeUtils.getInstance();
// remove, 就是移除文本中的CQ码
// 移除所有的CQ码
final String remove1 = utils.remove(cqCodeText);
// 移除所有的CQ码,并决定是否对文本执行trim
final String remove2 = utils.remove(cqCodeText, true);
// 移除所有的CQ码,决定是否trim,决定如果字符为纯空白字符是否忽略
final String remove3 = utils.remove(cqCodeText, true, true);
// 移除所有的CQ码,决定是否trim,决定如果字符为纯空白字符是否忽略,并提供一个移除后剩余字符串的拼接字符
final String remove4 = utils.remove(cqCodeText, true, true, ",");
// 移除指定类型的CQ码
final String remove5 = utils.removeByType("at", cqCodeText);
// removeByType也同样拥有remove方法的那些参数,不再列举
System.out.println(remove1);
System.out.println(remove2);
System.out.println(remove3);
System.out.println(remove4);
System.out.println(remove5);
```
>[success] 输出结果为:
```
你好!哈哈这段话很长的。
你好!哈哈这段话很长的。
你好!哈哈这段话很长的。
你好!,哈哈,这段话很长的。
你好!哈哈这段话很长的。[CQ:image,file=http://forte.love:15520/img/r]
```
- **切割文本与CQ码**
```java
// 测试的CQ码 + 文本
String text = "[CQ:image,file=TOVNRSADSKM,url=http://image] 你好![CQ:at,qq=123456789]";
// 得到utils
KQCodeUtils utils = KQCodeUtils.getInstance();
// 切割后, 非CQ码以外的内容不会做任何处理(例如不会trim())
List<String> splitList = utils.split(text);
for (String s : splitList) {
System.out.println(s);
}
/*
输出,注意 ' 你好!'前面是有空格的
[CQ:image,file=TOVNRSADSKM,url=http://image]
你好!
[CQ:at,qq=123456789]
*/
// 切割, 并对每一条切割结果做处理,此处对每条结果进行去空格
List<String> splitList2 = utils.split(text, t -> t.trim());
for (String s : splitList2) {
System.out.println(s);
}
/*
输出, 此处便没有空格了
[CQ:image,file=TOVNRSADSKM,url=http://image]
你好!
[CQ:at,qq=123456789]
*/
```
<br>
- 前言
- 简单介绍
- 我该如何阅读文档
- 视频教程
- 安装与使用
- 开源协议
- 免责&捐助
- 注意事项
- 版本命名规则简介
- 主要功能版本历史
- 功能指引
- 通用API与功能
- 国际化语言
- 异常
- 消息监听
- @Listen
- @OnListen模板
- @Filter
- 消息参数截取
- @Spare
- @Constr
- @Ignore
- @ListenBreak
- @ListenBreakPlugin
- @ListenBody
- 监听响应
- 成功判定与返回值
- 监听上下文
- 动态参数
- 监听消息API
- 异步监听 @Async
- 限流监听 @Limit
- 自定义Http送信器
- 枚举与类型
- 送信器
- SENDER
- SETTER
- GETTER
- 返回值
- 其他位置
- 日志与日志拦截
- 异常处理
- 依赖注入
- 自定义依赖获取
- 批量依赖载入
- 注意事项
- 常量
- 定时任务
- 自定义过滤
- 拦截器
- 拦截器总定义
- 上下文对象总定义
- 监听消息拦截
- 送信器拦截
- 监听函数拦截
- CAT码
- CQ码
- CQCode
- CQ码工具类
- CQ扩展工具类
- AppendList拼接链
- 高级内容
- 阻断机制
- 截断机制
- 自定义枚举类型
- 枚举工厂
- byName注解
- 自定义注解
- 配置
- 文件配置
- 注解配置
- 参数配置
- 多配置
- 多账号
- 自定义账号管理器
- 小心!
- 核心版本与组件如何升级核心
- 核心版本迭代指南
- 核心
- 更新日志
- jar包与依赖
- 监听消息类结构图
- 快速启动
- 模组与扩展
- 模组开发
- 现有模组
- 通用模组-延时任务
- 通用模组-CQ码工具
- 转义器
- CQ码操作工具类
- CQ码模板-CodeTemplate
- CQ码载体-KQCode
- CQ码构建器
- MQ码工具类
- 通用模组-redis-bot管理器
- 通用模组-Debugger
- Debugger-common模块
- Debugger-server模块
- Debugger-client模块
- 通用模组-钉钉机器人
- 组件-Mirai(JVM)
- 快速开始(1.13+)
- springboot-starter
- 注意事项
- 配置
- 额外的内容
- 快速回复
- 额外监听
- CQ码解析
- 组件-酷Q(QQ)-CQ HTTP API(基本失效)
- 快速开始(推荐)
- 快速开始(1.7.x以下,不推荐)
- 快速开始(Springboot启动器)
- 启动器、启动接口与配置类
- 配置
- 文件配置
- 注意事项
- 更新日志
- 额外的内容
- 自定义额外监听
- CQ送信器
- 元事件
- 监听消息类结构图
- 组件-酷Q(QQ)-JCQ(失效)
- 快速开始
- 更新日志
- 额外的内容
- JCQ日志
- 配置
- 注意事项
- 监听消息类结构图
- 组件-酷Q(QQ)-HTTP TO CQ(失效)
- 快速开始(核心1.7.x及以下)
- 启动器、启动接口与配置类
- 配置
- 文件配置
- 注意事项
- 更新日志
- 监听消息类结构图
- 组件-酷Q(QQ)-LEMOC (失效)
- 快速开始(核心1.7.x及以下)
- 配置
- 注意事项
- 更新日志
- 监听消息类结构图
- Springboot快速启动器
- 常见问题汇总
- BUG反馈
- 更新计划总览