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

如何用正则表达式将字符串平分为两个等长捕获组?

捕获字符串等长前后分组的正则解决方案

核心需求

需要将任意长度为偶数的字符串平分为两个等长分组(前后内容可不同),替代循环尝试^(.{1})(.{1})$、^(.{2})(.{2})$这类繁琐写法。


1. sed ERE 实现方案

sed的ERE不支持PCRE的环视、条件判断、\K等特性,需结合长度计算动态生成匹配规则,以下是两种实用方式:

方式1:结合shell长度计算(最直接)

先通过shell获取字符串长度,再动态生成正则拆分:

# 示例:处理字符串"1@ #t4r/"
input="1@ #t4r/"
half_len=$(( ${#input} / 2 ))
echo "$input" | sed -E "s/^(.{$half_len})(.*)$/\1 \2/"

输出:1@ # t4r/

方式2:纯sed内部实现(无外部依赖)

通过sed循环标记字符,间接计算长度后拆分:

sed -E '
  :count
  s/^(.)(.*)$/\1\n\2/
  t count
  s/\n//g
  s/^(.*)(.*)$/\1 \2/
'

原理:通过循环在每个字符后插入换行,最终换行数量等于字符串长度,再通过替换拆分前后半段。


2. PCRE 风味实现方案

支持PCRE的工具(Perl、Python re、grep -P、PHP preg等)可用更简洁的正则直接匹配:

^(?:.(?=.*?((?(1).\1|.)$)))+\K\1

工作原理:

  • ^(?:.(?=.*?((?(1).\1|.)$))):通过正向预查遍历每个字符,同步构建后半段捕获组(条件判断(?(1).\1|.)确保捕获组长度与前半段一致)。
  • +\K\1:丢弃前置匹配内容,仅保留最终捕获的后半段;前半段可通过^.{n/2}获取,或调整正则同时捕获两组。

示例验证

以下是不同输入的拆分结果:

Input          -> Captured Groups
"1234"         -> "12" "34"
"aa"           -> "a" "a"
"examples"     -> "exam" "ples"
"101010"       -> "101" "010"
"1@ #t4r/"     -> "1@ #" "t4r/"
"a b c    defgh" -> "a b c  " "  defgh"
"abc    def"     -> "abc  " "  def"
"abcd  e  f"     -> "abcd " " e  f"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:48:17