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

正则表达式能否仅在匹配组内执行替换操作?

解决方案

要实现只对dqlParse后的内容(第二个匹配组)执行空白替换,你需要使用正则回调函数替换——静态替换字符串无法单独处理分组内的内容,回调函数可以灵活操作每个捕获组。

核心思路

  1. 用正则精准匹配每个以dqlParse开头的片段,捕获标记本身和后续内容两个分组
  2. 对第二个分组单独执行空白清理,再拼接回原标记

具体实现

正则表达式

使用这个正则来匹配目标片段:

/(dqlParse)([\s\S]*?)(?=\s*dqlParse|$)/g
  • (dqlParse):捕获标记字符串,作为第一个分组$1
  • ([\s\S]*?):非贪婪匹配所有内容(包括换行、制表符等),作为第二个分组$2([\s\S]替代.,解决.不匹配换行的问题)
  • (?=\s*dqlParse|$):正向预查,确保匹配到的片段截止到下一个dqlParse(可能带前置空白)或字符串结尾,避免一次性匹配所有内容

结合string-replace-loader的配置

在webpack配置中添加如下规则,利用回调函数处理分组内容:

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/, // 匹配你需要处理的文件类型
        loader: 'string-replace-loader',
        options: {
          search: /(dqlParse)([\s\S]*?)(?=\s*dqlParse|$)/g,
          replace: (match, p1, p2) => {
            // 清理p2中的空白:将任意连续空白替换为单个空格,同时移除首尾空白
            const cleanedContent = p2.replace(/\s+/g, ' ').trim();
            // 拼接回原标记和清理后的内容
            return `${p1} ${cleanedContent}`;
          },
        },
      },
    ],
  },
};

效果说明

假设原内容是:

dqlParse
  SELECT *
  FROM table
  WHERE id = 1
dqlParse\tINSERT INTO table (name) VALUES ('test')

处理后会变成:

dqlParse SELECT * FROM table WHERE id = 1
dqlParse INSERT INTO table (name) VALUES ('test')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:10:29