You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用正则表达式将「§ 1」「§s 1, 2, [数量不确定]」中的空格全部替换为下划线?

解决段落符号后多数字的正则替换问题

首先,你的原始正则§ (\d+)针对单个数字的场景没问题,但要处理带后缀(比如§s)和多个数字的情况,我们可以分两步或三步正则替换来实现,要是你的正则引擎支持回调函数(比如Python、JavaScript),还能一步搞定。下面分情况说明:

情况1:基础需求——将所有数字前的空格替换为下划线

如果你只需要把每个数字和前面的分隔符(前缀后的空格、逗号后的空格)都换成下划线,比如把§s 1, 2, 3转成§s_1,_2,_3,用两个全局正则替换即可:

第一步:处理前缀与第一个数字之间的空格

查找模式:(§s?) (\d+)
替换规则:$1_$2

  • 解释:§s?匹配§或者§s?表示s可选);(\d+)捕获数字;替换时把中间的空格换成下划线。

第二步:处理逗号与后续数字之间的空格

查找模式:, (\d+)
替换规则:,_$1

  • 解释:全局匹配所有逗号加空格加数字的组合,把空格换成下划线。

比如输入§s 23, 12会变成§s_23,_12,输入§ 5也能正常转成§_5,完美兼容你的原始需求。

情况2:进阶需求——最后一个数字前用_and_替换

如果需要像你例子里那样,把最后一个数字前的逗号换成_and_(比如§s 1, 2, 3§s_1,_2_and_3),在完成上面两步后,再加第三步替换:

查找模式:,_(\d+)$
替换规则:_and_$1

  • 解释:匹配字符串末尾的,_数字组合,替换成_and_数字

示例(Python代码)

import re

def format_section(text):
    # 处理前缀和第一个数字
    text = re.sub(r'(§s?) (\d+)', r'\1_\2', text)
    # 处理逗号后的数字
    text = re.sub(r', (\d+)', r',_\1', text)
    # 替换最后一个逗号为_and_
    text = re.sub(r',_(\d+)$', r'_and_\1', text)
    return text

# 测试
print(format_section("§s 1, 2, 3"))  # 输出:§s_1,_2_and_3
print(format_section("§ 23, 12"))    # 输出:§_23_and_12
print(format_section("§ 5"))         # 输出:§_5

为什么你之前的尝试没成功?

你写的(§|§-d) (\d+)有两个明显问题:

  1. §-d是错误写法,要匹配带s的§s应该用§s,或者用§s?同时兼容§§s
  2. 这个模式只能匹配单个数字的情况,没法处理逗号分隔的多数字列表,所以需要分步骤处理后续数字。

如果你的正则引擎支持回调函数(比如JavaScript),还能一步完成所有处理:

JavaScript示例

function formatSection(text) {
    return text.replace(/(§s?) ((?:\d+, )+\d+)/, (match, prefix, nums) => {
        const numList = nums.split(', ');
        if (numList.length === 1) {
            return `${prefix}_${numList[0]}`;
        }
        const lastNum = numList.pop();
        return `${prefix}_${numList.join(',_')}_and_${lastNum}`;
    });
}

// 测试
console.log(formatSection("§s 1, 2, 3")); // 输出:§s_1,_2_and_3
console.log(formatSection("§ 5")); // 输出:§_5

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

火山引擎 最新活动