首页 > 解决方案 > 使用空格分隔符批量迭代字符串,查找包含子字符串的单词

问题描述

我不明白为什么这不起作用

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set contents=sdflkm efsdf sdfkns CRQ239478239
for /f "tokens=1* delims= " %%i in ("%contents%") do (
  set str=%%i
  echo str: !str:~0,3!
    if "!str:~0,3!"=="CRQ" (
      set revision=!str!
    )
)
echo revision: %revision%

我想提取以“CRQ”开头的字符串中的单词。但是这个 for 循环只进行一次迭代,抓取字符串的前 3 个字母。输出只是str: sdf. 它应该检查字符串中每个单词的前 3 个字母,如果前 3 个字母是“CRQ”,它应该将修订变量设置为包含 CRQ 的单词。我该怎么做呢?

标签: windowsbatch-file

解决方案


for命令将遍历输入。由于您的字符串仅包含一行,因此您只能通过循环获得 1 次迭代。

for循环将该单行标记为多个标记。它将第一个令牌传递给%i,然后,多亏了 中的星号tokens=1*,它将其余的放入%j。如果你稍微改变你的脚本,你可以看到:

set contents=sdflkm efsdf sdfkns CRQ239478239
for /f "tokens=1*" %%i in ("%contents%") do (
  set str=%%i
  echo str: !str:~0,3!
  echo rest: %%j
    if "!str:~0,3!"=="CRQ" (
      set revision=!str!
    )
)
echo revision: %revision%

输出:

str: sdf
rest: efsdf sdfkns CRQ239478239
revisionx:

我的解决方案是创建一个子例程,您可以在剩余的令牌上递归调用该子例程,直到您找到所需的令牌:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set contents=sdflkm efsdf sdfkns CRQ239478239
call :ParseTokens %contents%
echo revision: %revision%

rem Subroutine ParseTokens
:ParseTokens
set ToParse=%*
for /f "tokens=1*" %%i in ("%ToParse%") do (
    set str=%%i
    if "!str:~0,3!"=="CRQ" (
      set revision=!str!
      exit /b
    ) else (
        call :ParseTokens %%j
    )
)
exit /b

推荐阅读