Las*_*007 4 string replace wildcard batch-file
我有一个base形式的字符串*+*。我想得到+之前的所有内容。例如,如果base=foo+bar,我想得到foo。
我尝试过用字符串替换来做到这一点
set left=%base:+*=%
Run Code Online (Sandbox Code Playgroud)
但这会导致left存储foo+bar。
有趣的是,字符串替换可以使 + 的所有内容正确无误:
set right=%base:*+=%
Run Code Online (Sandbox Code Playgroud)
是否+*被替换+(即通配符替换 0 个字符)?有更好的方法来完成我的任务吗?
编辑:我实际上是在 for 循环中执行此操作。因此,延迟扩展已开启并且(我认为)我需要使用!。完整代码在这里:
for /d %%d in (*+*) do (
set base=%%d
set right=!base:*+=!
set left=!base:+*=! ::this part doesn't work
if !left:~-2!==!right:~-2! ( ::do only if last 2 chars match
copy %%d mirrors
copy %%d\%%d_montage.bmp mirrors
)
)
Run Code Online (Sandbox Code Playgroud)
编辑2:上面代码中的注释仅用于此处的可读性。:: 样式的注释在 for 循环中可能无法正常工作。
你可以使用这个技巧:
@echo off
set "base=foo+bar"
set "left=%base:+=" & set "right=%"
echo Left=%left%
echo Right=%right%
Run Code Online (Sandbox Code Playgroud)
编辑:如果您想在for循环内使用该方法,请按以下方式使用:
@echo off
setlocal EnableDelayedExpansion
for %%a in ("one+two" "first+last") do (
call :separate %%a
echo Left=!left!
echo Right=!right!
echo/
)
goto :EOF
:separate
set "base=%~1"
set "left=%base:+=" & set "right=%"
exit /B
Run Code Online (Sandbox Code Playgroud)