windows - 使用空格分隔符批量迭代字符串,查找包含子字符串的单词
问题描述
我不明白为什么这不起作用
@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 的单词。我该怎么做呢?
解决方案
该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
推荐阅读
- twincat - 有没有办法打印到输出控制台?(双猫3)
- python - ValueError:在 Keras 中使用自定义指标时的未知指标函数
- javascript - 从php中数组的输入文件列表中删除特定文件
- json - 如何制定最有效和最高效的逻辑来检查数据库中的数据是否存在?
- jquery - 单独修改select2下拉位置
- matlab - 如何在 Matlab 中绘制对角直方图
- angular - node_modules/@angular/core/src/render3/ng_dev_mode.d.ts(9,11) 中的错误:错误 TS2451:无法重新声明块范围变量“ngDevMode”
- youtube-api - Youtube liveBroadcast 插入限制?
- javascript - 在 React 中使用 Map 和 firebase
- sql-server - 在同一张表中返回当月工资和上月工资