我想分割一个字符串两部分,而不使用任何for循环.
例如,我有一个变量中的字符串:
str=45:abc
我想在另一个变量中得到一个变量和abc的45.是否可能在批处理文件?
模式就像somenumber:somestring
你可以用不同的方式拆分str.
原文链接:https://www.f2er.com/windows/371034.htmlfor循环,你不想使用它.
尾随部分很容易与*(匹配任何东西直到…)
设置“var2 =%str:*:=%”
领先的部分可以用一个讨厌的技巧来完成
设置“var1 =%str :: =”^& REM#%
需要插入符号来避开&符号,
所以有效的结肠将被“& REM#
所以在你的情况下,你得到了替换后的行
设置“var1 = 4567”& REM #abcde
这被分为两个命令
set "var1=4567" REM #abcde`
完整的代码在这里:
set "str=4567:abcde" echo %str% set "var1=%str::="^&REM #% set "var2=%str:*:=%" echo var1=%var1% var2=%var2%
编辑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!
解决方案3:补充dbenhams答案
Dbenham在他的解决方案中使用带有管道的换行.
这似乎有点复杂.
解决方案使用这个事实,解析器在非转义换行符之后(当在special character phase之前或之后找到它)时删除该行的其余部分.
首先,将冒号替换为延期扩展替换的换行符.
这是允许的,换行符现在是变量的一部分.
然后线设置lead =%lead%剥离尾部.
最好不要在这里使用扩展语法,如果引号是字符串的一部分,那么“lead =%lead%”将会中断.
setlocal enableDelayedExpansion set "str=45:abc" set ^"lead=!str::=^ !" set lead=%lead% echo "!lead!"