如何在批处理文件中拆分不带for循环的字符串

Cra*_*der 14 dos batch-file

我想将一个字符串分成两部分,而不使用任何for循环.

例如,我在变量中有字符串:

str=45:abc
Run Code Online (Sandbox Code Playgroud)

我想进入45变量和abc另一个变量.是否可以在批处理文件中?

模式就像某些数字:somestring

jeb*_*jeb 17

你可以用不同的方式拆分str.

for循环,你不想使用它.

尾随部分很容易*(匹配任何东西,直到......)
set "var2=%str:*:=%"

领先的部分可以用一个讨厌的技巧完成
set "var1=%str::="^&REM #%

需要使用插入符号以逃避&符号,
因此有效地将冒号替换为"&REM # 所以在您的情况下,您在替换后获得了该行
set "var1=4567"&REM #abcde
并将其拆分为两个命令

set "var1=4567"
REM #abcde` 
Run Code Online (Sandbox Code Playgroud)

完整的代码在这里:

set "str=4567:abcde"
echo %str%
set "var1=%str::="^&REM #%
set "var2=%str:*:=%"
echo var1=%var1% var2=%var2%
Run Code Online (Sandbox Code Playgroud)

编辑2:更稳定的领导部分

感谢Dave使用换行的想法.
对于带引号和特殊字符的内容,REM技术不是很稳定.
但是使用换行技巧存在一个更稳定的版本,当split参数长于单个字符时也可以使用.

@echo off
setlocal enableDelayedExpansion
set ^"str=456789#$#abc"
for /F "delims=" %%a in (^"!str:#$#^=^

!^") do (
  set "lead=%%a"
  goto :break
)
:break
echo !lead!
Run Code Online (Sandbox Code Playgroud)

解决方案3:Adbeated dbenhams回答

Dbenham在他的解决方案中使用了带管道的换行器.
这似乎有点过于复杂.
由于解决方案使用的事实是,解析器在未转义的换行符之后删除了其余的行(当在特殊字符阶段之前或之后找到它时).

首先,冒号字符被替换为具有延迟扩展替换的换行符.
这是允许的,换行现在是变量的一部分.
然后该线set lead=%lead%剥离尾部.
最好不要在这里使用扩展语法,因为set "lead=%lead%"如果引号是字符串的一部分会中断.

setlocal enableDelayedExpansion
set "str=45:abc"
set ^"lead=!str::=^

!"
set lead=%lead%
echo "!lead!"
Run Code Online (Sandbox Code Playgroud)