是否可以定义一个不限于1个字符的分隔符? 基于标题的例子,我想定义我的分隔符如“#+#”。 文本文件/行可以包含两个字符,但很less有机会遇到特定的子string/文本组合。
不,您不能在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
循环中检索数据的变量(这里模拟的直接包含一个字符串)。 然后,在for
循环中标记化线,在延迟扩展被禁用,以避免与!
字符(如果延迟扩展处于活动状态,解析器将使用它们)。 这是循环内部的endlocal
的原因。
由于我们正在做一个字符串替换,并且可能以一个仅由分隔符组成的字符串结束,因此可能不会执行inner的do
子句,因此最终的if
被包含以确保enabledelayedexpansion
被取消。
我最近发现了一个有趣的技巧,它允许使用多字符字符串作为分隔符以非常简单的方式分割更大的字符串; 该方法不使用任何命令,而是在一行中执行分割! 这里是:
@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批处理的更多细节迭代通过分隔字符串