我想将字符串分成两部分,而不使用任何 for 循环。
例如,我在变量中有字符串:
str=45:abc
我想在一个变量中获取 45
并在另一个变量中获取 abc
。可以在批处理文件中吗?
模式就像 somenumber:somestring
最佳答案
您可以用不同的方式拆分 str。
for循环,你不想使用它。
尾随部分很容易使用*
(匹配任何内容,直到...)
设置“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:更稳定的领先部分
感谢戴夫提出使用换行的想法。
REM 技术对于带有引号和特殊字符的内容不太稳定。
但是,通过换行技巧,存在一个更稳定的版本,当分割参数长于单个字符时,该版本也可以工作。
@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 之前或中找到该换行时)。
首先,冒号字符被替换为具有延迟扩展替换的换行符。
这是允许的,换行符现在是变量的一部分。
然后,set Lead=%lead%
行将删除尾随部分。
最好不要在这里使用扩展语法,因为如果引号是字符串的一部分,set "lead=%lead%"
就会中断。
setlocal enableDelayedExpansion
set "str=45:abc"
set ^"lead=!str::=^
!"
set lead=%lead%
echo "!lead!"
关于batch-file - 如何在批处理文件中不使用for循环分割字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14620709/