是否可以定义一个不限于1个字符的分隔符?根据标题的示例,我想将我的分隔符定义为例如 '#+#'。文本文件/行可以包含两个字符,但是您遇到特定子字符串/文本组合的可能性很小。
答案 0 :(得分:4)
不,您不能在<{1}}子句中使用字符串作为分隔符。当然,您可以包含字符串,但它将作为一组单独的字符处理,这些字符将用作分隔符,而不是分隔符字符串。
如果您确实需要拆分字符串,最快的方法可能是用数据中未包含的字符替换分隔符字符串,并将此字符用作分隔符
delims=
注意:需要@echo off
setlocal enableextensions disabledelayedexpansion
for /f "delims=" %%a in ("this is a +test!! #+# of string #splitting#") do (
set "buffer=%%a"
setlocal enabledelayedexpansion
(for /f "tokens=1,2 delims=¬" %%b in ("!buffer:#+#=¬!") do (
endlocal
echo full line : [%%a]
echo first token : [%%b]
echo second token : [%%c]
)) || if "!!"=="" endlocal
)
才能读取检索数据的setlocal enabledelayedexpansion
循环内更改的变量(此处直接模拟包含字符串)。然后,在for
循环内标记了readed行,延迟扩展被禁用以避免for
个字符出现问题(如果延迟扩展处于活动状态,它们将由解析器使用)。这就是循环中!
的原因。
由于我们正在进行字符串替换并且可能以仅由分隔符组成的字符串结束,因此内部endlocal
的{{1}}子句可能不会被执行,因此包含最终do
以确保for
被取消。
答案 1 :(得分:2)
我最近发现了一个有趣的技巧,允许使用多字符串作为分隔符,以非常简单的方式分割更大的字符串;该方法不使用任何for
命令,但只在一行中执行拆分!这里是:
@echo off
set "str=this is a +test!! #+# of string #splitting#"
set "first=%str:#+#=" & set "last=%"
echo full line : [%str%]
echo first token : [%first%]
echo last token : [%last%]
此方法还允许在多个部分中拆分大字符串,并将所有存储在数组中。有关详情,请访问dos batch iterate through a delimited string