Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 批处理*通配符替换_String_Batch File_Replace_Wildcard - Fatal编程技术网

String 批处理*通配符替换

String 批处理*通配符替换,string,batch-file,replace,wildcard,String,Batch File,Replace,Wildcard,我有一个base格式的字符串*+*。我想在+之前得到所有东西。 例如,如果base=foo+bar,我想得到foo 我试过用字符串替换法 set left=%base:+*=% 但这会导致left存储foo+bar 有趣的是,字符串替换可以使+的所有内容都正确: set right=%base:*+=% 是否将+*替换为+(即通配符替换0个字符)?有没有更好的方法来完成我的任务 编辑:我实际上是在一个for循环中这样做的。因此,延迟扩展已打开,(我认为)我需要使用!。完整代码如下: for

我有一个
base
格式的字符串
*+*
。我想在+之前得到所有东西。 例如,如果
base=foo+bar
,我想得到
foo

我试过用字符串替换法

set left=%base:+*=%
但这会导致
left
存储
foo+bar

有趣的是,字符串替换可以使+的所有内容都正确:

set right=%base:*+=%
是否将
+*
替换为
+
(即通配符替换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
    )
)
编辑2:以上代码中的注释仅用于此处的可读性,因此:-样式注释在for循环中可能无法正常工作。

请参阅

从字符串右侧删除字符需要两个步骤,需要使用CALL语句:


我从来没有用通配符替换过环境变量字符串,可能是因为发行了正确的wOxxOm注释

我倾向于采用这种方法:

for /f "tokens=1,2 delims=+" %a in ('echo %base%') do (
    set left=%a
    set right=%b
)
您可以使用:

编辑:如果要在
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

可以从字符串中减去右侧:

@echo off
setlocal enabledelayedexpansion
set "base=foo+bar"
set left=%base:*+=%
set "right=!base:+%left%=!"
echo %left% / %right%
但我建议另一种方法:

@echo off
set "base=foo+bar"
for /f "tokens=1,* delims=+" %%i in ("%base%") do (
  set "left=%%i"
  set "right=%%j"
)
echo %left% / %right%

你是用什么语言写的?从语法和标记来看,这是一个Windows批处理文件。是的,只是想了想,但是我用的不是
'echo%base%'
,而是
%base%”
。你应该使用
“tokens=1*”
,以防万一右边有额外的
+
。@dbenham不会有。我实际上是在for循环中这样做的,那么我需要在哪里用!?也许到处都是。在第一篇文章中编辑你的问题并添加相关的代码。好吧,你只需要在
set left=
之前添加
call
。或者你也可以使用其他答案。按照预期工作,我在这一过程中学会了一些技巧。投了很多票。
@echo off
setlocal enabledelayedexpansion
set "base=foo+bar"
set left=%base:*+=%
set "right=!base:+%left%=!"
echo %left% / %right%
@echo off
set "base=foo+bar"
for /f "tokens=1,* delims=+" %%i in ("%base%") do (
  set "left=%%i"
  set "right=%%j"
)
echo %left% / %right%