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

批处理中字符串含分隔符相同字符时,如何仅处理指定分隔符?

解决批处理中仅分割指定位置下划线的问题

你的问题核心在于for /f的delims参数会将所有匹配的字符视为分隔符,而不是仅分割某一个特定的分隔位置。针对你需要提取最后一个下划线前的内容作为data_in,之后的作为data_out的需求,我们可以通过批处理的字符串操作来实现,而不是依赖for /f的分隔符功能。

修改后的代码

@echo off & Setlocal EnableDelayedExpansion
:: Load Variable From data*.txt
set /a Line=0
for /f "delims=" %%a in (data*.txt) do (
    set /A Line+=1
    set "str=%%a"
    :: 提取最后一个下划线后的内容作为data_out
    set "data_out=!str:*_=!"
    :extract_last
    if "!str:%data_out%=!"=="!str!" goto end_extract
    set "str=!str:%data_out%=!"
    set "data_out=!str:*_=!"
    goto extract_last
    :end_extract
    :: 提取最后一个下划线前的内容作为data_in
    set "data_in=!str:~0,-1!"
    :: 处理开头就是下划线的特殊情况
    if "!data_in!"=="" set "data_in=_"
    :: 赋值到目标变量
    set "data_in!Line!=!data_in!"
    set "data_out!Line!=!data_out!"
)
set data
pause

代码细节解释

  1. 临时变量存储行内容:把当前读取的每行内容%%a赋值给str,方便后续进行字符串截取和替换操作。
  2. 循环提取最后下划线后内容:
    • !str:*_=!会自动去掉字符串中第一个_及其前面的所有内容,得到剩余部分。
    • 通过循环重复这个逻辑,直到去掉提取的内容后str不再变化,此时data_out就是最后一个_后面的目标字段。
  3. 截取下划线前的内容:!str:~0,-1!会截取str去掉最后一个字符(也就是最后一个_)后的内容,作为data_in。
  4. 特殊场景兼容:针对开头就是下划线的行(比如_dd.pnh_444),处理后data_in会为空,这里手动补全为_保证数据完整性。

测试验证效果

用你的测试数据运行这段代码,会得到完全符合预期的结果:

  • 对于e_e.pop_555,data_in为e_e.pop,data_out为555
  • 对于_dd.pnh_444,data_in为_dd.pnh,data_out为444
  • 对于ff_.oiu_666,data_in为ff_.oiu,data_out为666

内容的提问来源于stack exchange,提问作者Q̞ī̯X̶͇͇͇͇͇͇͇͇͇͇͇͇͇̯̯̳̳͈͈͈͆͆

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:57:04