#batch-file #substring #script
Вопрос:
У меня есть требование к пакетному сценарию, в котором мне нужно извлекать числа, указанные в скобках. Пример -abc(12349) На выходе должно быть 12349
Пожалуйста, предложите
Комментарии:
1. Я подозреваю, что если бы вы знали правильные термины для поиска, вы бы сами смогли найти решение. В этом случае вам нужно будет использовать квадратные скобки в качестве разделителей и обработать строку с помощью цикла for, а затем извлечь маркер , содержащий строку, которую вы ищете.
Ответ №1:
Если ваши входные строки будут содержать только один набор круглых скобок, for /f
будет достаточно цикла с использованием разделителей ()
и захвата 2
маркера nd:
:# commandline example. double % characters for use in a batch file
For /f "tokens=2 Delims=()" %G in ("-abc(12349)")Do Echo(%G
Однако, если ваши входные строки могут содержать несколько наборов скобок или ложных срабатываний (скобки, содержащие нежелательные данные), регулярное выражение является лучшим вариантом для обеспечения того, чтобы извлеченное содержимое соответствовало желаемому. Пакет изначально не поддерживает сложные шаблоны регулярных выражений, однако может использовать для этого powershell. (конечно, вы, скорее всего, могли бы выполнять любой набор задач, которые вы выполняете полностью в powershell)
пример:
@Echo off
Set "RegexArgs="^.*?[-][a-z]{0,3}(" ").*?$" "d ""
Call :Extract %RegexArgs% rVar1 "-abc(12349)"
Call :Extract %RegexArgs% rVar2 "hello(0) -def(42)"
Call :Extract %RegexArgs% rVar3 "false -tis(notnumbers)"
Call :Extract %RegexArgs% rVar4 "false -istoolong(0)"
Set rVar
Goto :Eof
:Extract <Regex:Prefix> <Regex:Suffix> <Regex:Target> <ReturnVar> <String>
:# Regex patterns recieved as args are not validated. See below link for regex syntax.
:# https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_regular_expressions?view=powershell-7.1
If "%~5" == "" Exit /b 1
Set "Prefix=%~1"
Set "Suffix=%~2"
Set "Target=%~3"
Set "String=%~5"
Setlocal EnableDelayedExpansion
Set "String=!String:^^=^!"
Set "Prefix=!Prefix:^^=^!"
Set "Suffix=!Suffix:^^=^!"
Set "Target=!Target:^^=^!"
For /f "usebackq Delims=" %%G in (`
powershell -nologo -noprofile -c ^
"If('!String!' -match '!Prefix!!Target!!Suffix!
Ожидаемый результат:
rVar1=12349
rVar2=42
) {$String = $('!String!' -replace '!Prefix!' -replace '!Suffix!');write-host "$String"}"
`)Do Endlocal amp; Set "%4=%%G"
Goto :Eof
Ожидаемый результат: