批处理中字符串含分隔符相同字符时,如何仅处理指定分隔符?
解决批处理中仅分割指定位置下划线的问题
你的问题核心在于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
代码细节解释
- 临时变量存储行内容:把当前读取的每行内容
%%a赋值给str,方便后续进行字符串截取和替换操作。 - 循环提取最后下划线后内容:
!str:*_=!会自动去掉字符串中第一个_及其前面的所有内容,得到剩余部分。- 通过循环重复这个逻辑,直到去掉提取的内容后
str不再变化,此时data_out就是最后一个_后面的目标字段。
- 截取下划线前的内容:
!str:~0,-1!会截取str去掉最后一个字符(也就是最后一个_)后的内容,作为data_in。 - 特殊场景兼容:针对开头就是下划线的行(比如
_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̶͇͇͇͇͇͇͇͇͇͇͇͇͇̯̯̳̳͈͈͈͆͆
相关产品推荐
相关产品推荐

