使用 /f delims 获取子字符串并仍然保留所有分隔符

Get substring using /f delims and still keep all delimiter characters

我必须使用批处理从字符串中提取子字符串。我在谷歌上搜索了一下似乎使用 /f delims 是可行的方法,但我被卡住了,delims 也剥离了字符串中的所有定界符 (= ;)。

SET STRING={"Building":{"type":"String","value":"Suite=123:638.way;PC=777;Contact Number=019553;"}}
FOR /f "tokens=4,5 delims=:" %%a in ("%STRING%") do (
  set SUBSTRG=%%a
  set SUBSTRG2=%%b
)
echo %SUBSTRG% %SUBSTRG2%

我想从 STRING 中提取子字符串“"Suite=123:638.way;PC=777;Contact Number=019553;"。但是使用代码中所述的 delims,我最终得到了 "Suite 123638.way PC 777 Contact Number 019553 "}} 我对批处理命令知之甚少,我该如何解决这个问题?有没有比使用 /f delims 更好的方法?

是的,我不会为此使用 for /f 循环。我坚信在抓取任何类型的结构化数据时使用能够理解结构的解析器——XML 解析器用于 XML 数据,JSON 解析器用于 JSON数据等等。因此,与纯 Batch 相比,我更有可能为此使用 PowerShell 或 JScript。下面是一个 Batch + PowerShell 混合脚本示例,它演示了:

<# : batch portion
@echo off & setlocal

set JSON={"Building":{"type":"String","value":"Suite=123:638.way;PC=777;Contact Number=019553;"}}

for /f "delims=" %%I in (
    'powershell -noprofile "iex (${%~f0} | out-string)"'
) do set "value=%%~I"

echo Scraped value: %value%
exit /b

: end Batch / begin PowerShell #>
add-type -AssemblyName System.Web.Extensions
$JSON = new-object Web.Script.Serialization.JavaScriptSerializer
$obj = $JSON.DeserializeObject($env:JSON)
$obj.Building.value

这种方法对间距异常、可变顺序等更有弹性,因为您是按对象层次结构而不是纯文本检索 "value" 值。

如果您更喜欢纯批处理解决方案,我会使用可变子字符串替换来 trim 去除不需要的部分:

@echo off & setlocal

set JSON={"Building":{"type":"String","value":"Suite=123:638.way;PC=777;Contact Number=019553;"}}

rem // Step 1: Strip everything before and including value":"
set "str=%JSON:*value":"=%"

rem // Step 2: Strip everything after and including the next quotation mark
set str=%str:"=&rem;%

rem // Step 3: output result
echo Scraped value: %str%

它更简单且非常高效,但它也严重依赖于您的数据可预测地保持相同的顺序和间距。它比使用 JSON 解析器更脆弱。