你真的会用VSCode查找分组吗?90%的人都忽略的关键细节

第一章:你真的了解VSCode查找中的正则分组吗

在日常开发中,VSCode 的查找功能是提升效率的重要工具。当结合正则表达式使用时,其能力更加强大,尤其是“正则分组”这一特性,常被忽视却极具价值。正则分组允许你将匹配内容划分为多个子表达式,并在替换时引用这些分组,实现智能文本重构。

捕获分组的基本语法

在 VSCode 查找框中启用正则模式(点击 .* 图标),即可使用分组。使用圆括号 () 定义捕获组,通过 $1、$2 等在替换字段中引用。 例如,将驼峰命名的变量转换为下划线命名:
  • 查找:([a-z])([A-Z])
  • 替换:$1_$2
该规则会将如 myVariableName 转换为 my_Variable_Name。

实际应用场景

假设需要批量修改日志语句格式:
// 原始代码
console.log("User " + userName + " logged in");

// 目标格式
log.info("User %s logged in", userName);
可使用以下正则进行智能替换:
查找console\.log\("([^"]+)"\s*\+\s*([^\s\+]+)
替换log.info("$1 %s", $2
其中,$1 对应字符串内容,$2 对应变量名。

非捕获分组优化性能

若仅需分组但不引用,可使用非捕获分组 (?:) 避免创建引用编号:
(https?:\/\/)(?:www\.)?([a-zA-Z0-9\-]+\.[a-z]+)
此表达式中,$1 为协议,$2 为主域名,中间部分不占用引用编号。 合理使用分组能极大增强查找替换的灵活性,是高效编码的必备技能。

第二章:正则分组基础与VSCode中的实现机制

2.1 捕获组与非捕获组的基本语法解析

在正则表达式中,捕获组用于提取匹配的子字符串,而非捕获组仅用于分组但不保存匹配内容。两者在语法上有明显区别。
捕获组语法
捕获组使用圆括号 () 定义,匹配的内容会被保存并可通过索引或名称引用:
(\d{3})-(\d{3})
该表达式会捕获两个由连字符分隔的三位数字。例如,在字符串 "123-456" 中,第一组捕获 "123",第二组捕获 "456"。
非捕获组语法
非捕获组通过 (?:) 语法实现,仅用于逻辑分组而不创建反向引用:
(?:https?|ftp)://([^\s]+)
此处 (?:https?|ftp) 匹配协议头但不被捕获,只有 URL 主体部分被保存。
  • 捕获组:开销较大,但可后续引用
  • 非捕获组:提升性能,适用于仅需分组场景

2.2 在VSCode查找中正确使用括号进行分组

在VSCode的搜索功能中,合理使用括号可以显著提升正则表达式匹配的精确度。通过圆括号 () 可以对模式进行逻辑分组,控制优先级并捕获子表达式。
分组的基本用法
^(error|warning):\s*(.+)$
该正则匹配日志行中的“error”或“warning”前缀。括号将 error|warning 分组,确保 | 仅作用于两个单词,而非整个表达式。外层括号捕获完整消息内容,便于后续提取。
非捕获组优化性能
当无需引用分组内容时,使用 (?:) 避免创建捕获:
https?://(?:www\.)?example\.com
此处 (?:www\.) 表示可选的“www.”前缀,但不保存该子匹配,减少资源开销。
  • 括号改变运算优先级,确保逻辑正确
  • 捕获组可用于替换操作中的 $1, $2 引用
  • 嵌套括号按左括号顺序编号

2.3 分组编号规则及其在替换操作中的引用

在正则表达式中,分组通过括号 () 定义,系统会自动为每个分组分配一个编号,从左至右依次为1、2、3……。这些编号可在替换操作中通过$1、$2等形式引用。
分组编号示例

文本:John Doe
正则:(\w+) (\w+)
替换:$2, $1
结果:Doe, John
上述代码中,第一个括号捕获 "John"(分组1),第二个捕获 "Doe"(分组2)。替换字符串使用$2, $1实现姓名顺序调换。
嵌套分组的编号规则
  • 分组按左括号出现顺序编号
  • 嵌套分组仍遵循从外到内的顺序编号
  • 编号一旦确定,在整个表达式中保持不变

2.4 嵌套分组的匹配逻辑与实际案例分析

在正则表达式中,嵌套分组通过括号的层级结构实现复杂模式的捕获。外层括号包含内层,匹配时按左括号出现顺序分配组号。
匹配优先级与捕获顺序
嵌套分组按从外到内的深度优先顺序编号。例如,(a(b(c)d)e) 包含三个捕获组:第1组为整体匹配,第2组为 bcd,第3组为 c。
实际应用示例
(\d{4})-(\d{2}-(\d{2}))
该表达式用于解析日期格式 2025-04-05:
  • 组1:年份 2025
  • 组2:月日部分 04-05
  • 组3:日期 05
此结构适用于需分别提取时间字段的场景,体现嵌套分组在结构化解析中的灵活性。

2.5 常见分组错误及调试技巧

聚合字段缺失导致的分组异常
在使用 GROUP BY 时,SELECT 中所有非聚合字段必须出现在分组条件中,否则将引发 SQL 错误。
SELECT user_id, status, COUNT(*) 
FROM orders 
GROUP BY user_id;
上述语句会报错,因为 status 未参与分组。正确写法应为:
SELECT user_id, status, COUNT(*) 
FROM orders 
GROUP BY user_id, status;
该修改确保每个输出字段在分组维度上唯一。
调试建议与常见陷阱
  • 检查 SELECT 与 GROUP BY 字段的一致性
  • 避免在 GROUP BY 中遗漏关键维度字段
  • 使用 HAVING 替代 WHERE 过滤聚合结果
典型错误对照表
错误类型原因解决方案
字段未分组非聚合字段未纳入 GROUP BY补充缺失字段
聚合嵌套错误SUM(AVG(x)) 等非法嵌套拆分为子查询处理

第三章:实用场景下的分组查找策略

3.1 提取日志中特定字段的结构化信息

在处理大量非结构化日志数据时,提取关键字段是实现监控与分析的前提。正则表达式和解析工具(如 Grok)是常用手段。
使用正则表达式提取字段
^(\S+) (\S+) (\S+) \[([\w:/]+\s[+\-]\d{4})\] "(\S+) (.+?) (\S+)" (\d{3}) (\d+)$
该正则匹配 Apache 访问日志中的远程IP、时间、请求方法、URL、状态码和响应大小。括号捕获子表达式,便于后续结构化提取。
结构化输出示例
字段值
IP地址192.168.1.1
请求路径/api/v1/users
状态码200
结合编程语言可将原始日志转换为 JSON 格式,便于存储与查询。

3.2 批量重命名变量或函数名的重构方案

在大型项目中,批量重命名是提升代码可维护性的关键操作。现代IDE和工具链提供了安全、高效的重构支持,确保符号引用的一致性。
使用IDE进行智能重命名
主流IDE(如IntelliJ IDEA、VS Code)支持语义级重命名。选中变量或函数名后,使用快捷键(如Shift+F6),工具会自动识别所有引用并高亮显示,确认后全局更新。
基于AST的脚本化重构
对于跨文件批量操作,可借助抽象语法树(AST)工具。例如,使用jscodeshift对JavaScript代码进行精确修改:

const { renameIdentifiers } = require('jscodeshift');

module.exports = function(fileInfo, api) {
  const j = api.jscodeshift;
  return j(fileInfo.source)
    .find(j.Identifier)
    .forEach(path => {
      if (path.node.name === 'oldFuncName') {
        path.node.name = 'newFuncName';
      }
    })
    .toSource();
};
该脚本遍历源码中的所有标识符,将oldFuncName安全替换为newFuncName,仅影响实际声明与引用,避免字符串误替换。结合glob模式可批量处理整个项目目录,实现自动化重构流水线。

3.3 匹配并重组HTML或JSON中的数据模式

在现代Web开发中,常需从非结构化或半结构化数据中提取关键信息。HTML与JSON作为常见的数据载体,其模式匹配与重组能力至关重要。
使用正则与DOM解析匹配HTML结构
对于嵌套的HTML内容,可结合DOM操作与正则表达式精准提取目标字段:

// 提取所有带有data-id属性的商品项
const items = Array.from(document.querySelectorAll('[data-id]'))
  .map(el => ({
    id: el.getAttribute('data-id'),
    name: el.querySelector('.name')?.textContent.trim(),
    price: parseFloat(el.querySelector('.price')?.textContent.replace('$', ''))
  }));
该代码利用querySelectorAll筛选含data-id的元素,再通过map构造标准化对象数组,实现HTML到结构化数据的转换。
重组JSON数据以适应前端需求
当后端返回的JSON层级复杂时,可通过映射函数扁平化结构:
  • 提取深层嵌套字段
  • 重命名不一致的键名
  • 合并冗余数组

第四章:高级分组技巧与性能优化

4.1 利用命名捕获组提升可读性与维护性

在正则表达式中,传统捕获组依赖位置索引来提取匹配内容,容易导致代码难以理解和维护。命名捕获组通过为分组赋予语义化名称,显著提升了可读性。
语法与示例
(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
该正则用于匹配日期格式 2025-04-05。其中 ?<year>、?<month> 和 ?<day> 为命名捕获组,分别捕获年、月、日部分,后续可通过名称直接访问,避免索引错乱问题。
优势分析
  • 提高代码可读性:变量名代替数字索引,逻辑更清晰
  • 增强维护性:调整分组顺序不影响引用逻辑
  • 减少错误:避免因新增分组导致的索引偏移问题

4.2 使用前瞻与后瞻断言配合分组精准定位

在正则表达式中,前瞻(lookahead)和后瞻(lookbehind)断言可用于在不消耗字符的情况下进行条件匹配,结合分组可实现更精确的文本定位。
正向与负向断言类型
  • 正向前瞻:(?=pattern),匹配后面紧跟指定模式的位置
  • 负向前瞻:(?!pattern),匹配后面不为指定模式的位置
  • 正向后瞻:(?<=pattern),匹配前面为指定模式的位置
  • 负向后瞻:(?<!pattern),匹配前面不为指定模式的位置
实际应用示例
(?<=\$)\d+(\.\d{2})?
该表达式匹配以美元符号$开头的价格数值,但不包含符号本身。其中: - (?<=\$) 是正向后瞻,确保数字前有美元符号; - \d+ 匹配整数部分; - (\.\d{2})? 可选地匹配两位小数。 此技术广泛应用于日志解析、数据提取等场景,提升匹配精度。

4.3 避免贪婪匹配对分组结果的影响

正则表达式中的量词默认是贪婪模式,会尽可能多地匹配字符,这可能干扰捕获分组的预期结果。
贪婪与非贪婪模式对比
  • 贪婪模式:*、+、{n,} 尽可能多匹配
  • 非贪婪模式:在量词后加 ?,如 *?、+?
示例说明
"(<.*>)"
该表达式试图提取第一个 HTML 标签,但由于 .* 贪婪匹配,会从第一个 < 匹配到最后一个 >,导致整个字符串被当作一个标签。 使用非贪婪模式修正:
"(<.*?>)"
此时匹配到第一个 > 即停止,正确分离出每个标签。
输入字符串贪婪结果非贪婪结果
<div>content</div><div>content</div><div>

4.4 多行匹配与跨行分组的实际应用

在日志分析和配置文件解析中,多行匹配是处理跨行结构数据的关键技术。正则表达式通过启用单行模式(如使用 s 修饰符)可使点号 . 匹配换行符,从而实现跨行捕获。
日志块提取示例
(?s)ERROR.*?\\nEndOfEntry
该正则匹配从 ERROR 开始、以 EndOfEntry 结束的多行日志块。(?s) 启用单行模式,.*? 非贪婪匹配中间内容,确保跨行数据完整性。
常见应用场景
  • Java 异常堆栈跟踪的定位与归类
  • Apache 配置文件中 VirtualHost 块的提取
  • Docker 日志中包含上下文信息的错误追踪
结合命名分组,可进一步结构化提取字段,提升文本处理精度。

第五章:掌握正则分组,真正提升开发效率

提取日志中的关键信息
在处理服务器日志时,常需从非结构化文本中提取时间、IP地址和请求路径。使用正则分组可高效完成该任务:

^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\s+(\d+\.\d+\.\d+\.\d+)\s+(GET|POST)\s+(\/[^\s]+)
匹配如下日志行:
2023-10-05 14:23:11 192.168.1.10 GET /api/users
捕获组分别对应时间、IP、方法和路径,便于后续结构化处理。
替换操作中的反向引用
正则分组支持反向引用,极大增强文本重构能力。例如,将“姓, 名”格式转换为“名 姓”:

const text = "Zhang, Wei";
const result = text.replace(/(\w+),\s+(\w+)/, '$2 $1');
// 输出: "Wei Zhang"
其中 $1 和 $2 分别引用第一个和第二个捕获组。
命名捕获组提升可读性
现代语言支持命名分组,使正则表达式更易维护。以JavaScript为例:

const regex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const match = '2023-10-05'.match(regex);
console.log(match.groups.year); // "2023"
实际应用场景对比
场景是否使用分组代码可维护性
解析URL参数是高
验证邮箱格式否中
提取JSON字段名是高
Python 爬取网页文字并保存为 txt 文件教程 将要爬取的网页网址赋值给变量url。 阅读详情

相关推荐

硬件工程师的蜗牛成长路

1、《模拟电路课程》R/L/C/继电器/光耦/二极管/三极管/MOS管磁珠/ESD/TVS/肖特基二极管/稳压二极管/保险丝/GDT/TSS/光耦/MOS/运放/BJT比较器/面板开关/按键开关/拨码开关/BUCK/LDO/电源防护器件LM5069单输出PLL/多路输出PLL/单端晶振/差分晶振/晶体(这方面不熟悉,待以后补充)1)速度传感器2)温度传感器3)倾斜角传感器4)火焰传感器5)红外传感器6)呼吸心跳采集chaunganqi1)数字隔离 电平转换芯片/磁隔离/专用隔离芯片。

caozhaokun的博客 1982

VSCode中正则查找替换的高级用法(90%开发者忽略的关键细节)

掌握VSCode查找替换正则表达式技巧,提升代码编辑效率。适用于批量修改变量名、清理日志、格式转换等场景,支持捕获组、反向引用与多行匹配,精准高效。90%开发者忽略的关键细节值得收藏。

DeepNest的博客 1676

本地部署gradle

在部署CAS构建执行包时,如果按照CAS的官方命令gradlew clean build,如果系统没安装过gradle,这个步骤将会从网上下载gradle,但是进度非常慢,耗时很长。为了更快地完成项目构建,我们可以直接在本地部署好gradle,节省一点时间。

益添的博客 780

VSCode中使用正则分组的终极指南(90%开发者忽略的关键细节)

掌握VSCode查找正则分组技巧,高效定位并提取代码中的关键信息。适用于批量替换、日志分析等场景,支持捕获组与反向引用,提升搜索精准度。90%开发者忽略的细节全解析,值得收藏。

DebugLoom的博客 831

Java面试题大全(2025版)

== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

2401_89221704的博客 2442

金桔智慧物流之容器(托盘、周转箱等)定位及周转方案原理

金桔智慧物流之容器(托盘、周转箱等)定位及周转方案原理 在物流行业种,托盘是标准化运输的关键的配件,而容器存在丢失、盘点、闲置等管理问题。如何通过信息化的手段提升容器的寿命,提高调配效率,降低闲置是物流容器行业的关键点。 金桔蓝牙网关配合金桔蓝牙资产管理终端可以解决物流行业痛点问题。 容器管理面临的问题: 技术方案 场景描述之库房 场景描述之车辆 场景描述之终端 方案优势 ...

jinjufocus的博客 1180

你真的会用VSCode格式化吗?90%程序员忽略的4个关键细节

掌握VSCode格式化技巧,提升代码整洁与开发效率。本文结合VSCode技能说明格式,解析自动格式化、保存时格式化、多语言支持与扩展配置四大细节,适用于前端、后端及跨平台开发场景。关键设置一文掌握,值得收藏。

FuncTide的博客 649

基于ESP32的室内空气质量检测系统开发

随着环境污染问题的日益严重,室内空气质量的监测变得越来越重要。室内空气质量的好坏直接影响到人们的健康,尤其是对于在封闭空间长时间待着的人群。为此,基于ESP32的室内空气质量检测系统应运而生。ESP32作为一款集成了Wi-Fi和蓝牙的高性能微控制器,为嵌入式开发提供了良好的平台,适用于构建各种智能硬件设备。本博客将详细介绍如何基于ESP32开发一个室内空气质量检测系统。系统可以实时监测空气中的温度、湿度、二氧化碳浓度、甲醛浓度等指标,并通过Wi-Fi将数据传输到云端或移动设备,方便用户随时查看空气质量情况。

2201_76125393的博客 832

你真的会用VSCode分屏吗?90%开发者忽略的布局细节曝光

掌握VSCode分屏编辑左右布局技巧,提升编码效率。适用于多文件对比、代码重构等场景,通过拖拽或快捷键快速实现窗口拆分,保持上下文同步浏览。合理布局让开发更流畅,工作效率翻倍,值得收藏。

PixelGlow的博客 690

【数据集7】全球人类住区层GHSL数据详解

全球人类住区层GHSL数据详解

WW、forever的博客 2253

RK3588S之CPU--benchmark(一)

本章会基于RK3588S来介绍有关CPU常用的benchmark工具及测试过程

文艺小少年的博客 1499

VSCode中使用正则进行分组替换的黄金法则(90%开发者忽略的关键细节)

掌握VSCode查找正则分组技巧,轻松实现高效代码重构。详解捕获组、反向引用等核心用法,覆盖批量重命名、格式化日志等实战场景,提升编辑效率80%以上。关键细节解析,90%开发者忽略的坑全避开,值得收藏。

DebugLoom的博客 727

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

你真的会设置VSCode窗口标题吗?90%开发者忽略的关键细节

掌握VSCode窗口标题格式设置技巧,提升多项目开发效率。本文详解如何自定义标题栏显示路径、工作区名称等信息,适用于多窗口协作与团队开发场景,让窗口管理更清晰高效。方法简单实用,值得收藏。

AlgoInk的博客 963

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

你真的会看VSCode终端日志吗?,90%开发者忽略的3个关键细节

掌握VSCode终端命令日志查看技巧,提升调试效率。揭秘过滤日志、定位错误和实时监控三大实用方法,适用于前端开发与自动化任务场景。90%开发者忽略的关键细节,助你快速排查问题,值得收藏。

FastDebug的博客 649

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

你真的会管理VSCode里的TypeScript版本吗:90%开发者忽略的关键配置细节

掌握VSCode TypeScript版本管理技巧,解决项目兼容性问题。详解如何切换内置与工作区TypeScript版本,避免类型校验错误。涵盖自动检测、本地安装、版本锁定等关键配置方法,提升开发效率。值得收藏

GatherTide的博客 930

为什么你的Prettier在VSCode中不起作用?90%的人都忽略了这3个细节

解决Prettier在VSCode中失效问题,掌握正确配置方法。本文详解编辑器设置、保存格式化触发条件及扩展冲突排查,覆盖前端开发常见场景。精准配置VSCode代码格式化工具(Prettier)配置,提升编码效率,值得收藏。

LogicNest的博客 2029

揭秘VSCode主题颜色修改:90%开发者忽略的3个关键配置细节

掌握VSCode主题颜色修改技巧,轻松打造个性化开发界面。详解编辑器配色方案、语义高亮与自定义设置三大关键细节,适用于前端、全栈等多场景。提升编码体验与效率,90%开发者忽略的配置秘诀,值得收藏。

VarLens的博客 795

VSCode分屏设置避坑指南(90%人都忽略的垂直布局细节)

掌握VSCode分屏垂直布局技巧,提升多文件编辑效率。适用于代码对比、前后端协同开发等场景,通过简单命令实现左右分屏与布局锁定,避免常见操作误区。界面清晰切换流畅,前端开发者高效工作必备,值得收藏。

CodeIsle的博客 1007

VSCode调试C++项目不生效?90%的人都忽略了这3个launch.json配置细节

解决VSCode C++ 调试不生效问题,关键在于launch.json配置细节。本文解析路径设置、调试器选择与参数配置三大要点,适用于本地及跨平台开发场景,提升调试效率。掌握这些技巧,告别断点无效、程序无法启动等常见问题,值得收藏。

LearnFlow的博客 957

ESLint与VSCode融合难题,90%开发者忽略的5个关键配置细节

解决ESLint与VSCode协同问题,掌握VSCode JavaScript规则配置精髓。涵盖自动修复、保存格式化、插件兼容等5个易忽略细节,提升开发效率与代码一致性。前端开发必备技巧,值得收藏。

PixelFlow的博客 643

揭秘VSCode中Java断点条件配置:90%开发者忽略的关键细节

掌握VSCode Java断点条件配置技巧,精准定位复杂问题。适用于多线程调试与循环中特定条件暂停,通过表达式设置动态触发,提升排查效率。90%开发者忽略的关键细节值得收藏。

PoliVein的博客 886

【Java开发者避坑指南】:90%人都忽略的VSCode JDK设置细节

解决VSCode中Java项目JDK版本错乱问题,本文详解JDK版本设置方法,涵盖launch.json配置、IDE环境匹配及多JDK切换技巧,适用于Spring Boot和Maven项目开发,确保编译运行一致,提升调试效率,值得收藏。

ByteShoal的博客 905

VSCode SSH端口转发避坑指南:90%开发者忽略的关键细节

解决远程开发连接难题,本文详解VSCode SSH 端口转发的正确配置方法,涵盖本地端口映射、防火墙设置与多场景应用技巧。避免常见错误,提升调试效率,远程开发更稳定高效,值得收藏。

BreakVein的博客 1153

如何在VSCode中优雅地使用Git Stash避免代码丢失?90%的人都忽略了这些细节

避免切换分支丢代码?掌握VSCode Git stash 暂存与恢复技巧,轻松应对开发中断。涵盖暂存修改、恢复进度、查看记录等实用操作,提升协作效率。细节决定成败,值得收藏。

LogicWander的博客 1095

VSCode重命名符号引用避坑手册(90%开发者忽略的关键细节)

掌握VSCode重命名符号引用正确方法,避免项目重构出错。适用于JavaScript、TypeScript等多语言场景,精准更新变量、函数名引用,确保代码一致性。支持跨文件智能识别,提升开发效率。关键细节解析,值得收藏。

LiteCompile的博客 660

团队协作总出问题?可能是没用VSCode配置Git提交模板(90%人忽略的关键细节)

解决团队协作混乱,只需配置VSCode Git的提交模板。适用于多人开发场景,通过统一提交格式提升代码管理效率。一键生成规范commit信息,减少沟通成本,关键细节设置全解析,值得收藏。

InstrWander的博客 1010
上一篇: 【程序员效率提升秘籍】:通过VSCode主题颜色优化视觉体验,减少眼疲劳
下一篇: VSCode Git冲突自救手册:从入门到精通的6个关键步骤
IterStream
博客等级 码龄1年 152粉丝 2112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值