Извлечение подстроки из строки с помощью пакета


Мне нужно извлечь подстроку (числовую с подчеркиванием) из строки с помощью пакетного файла. Например:

У меня есть AbC_d1344_454_78a. или Deg_e23_74_67.

Я хочу извлечь подстроки 1344_454_78 и 23_74_67.

3 2

3 ответа:

У вас есть несколько решений с пакетным файлом.

Если ваши данные всегда имеют одинаковое количество символов перед числами, вы можете сделать простую подстроку, чтобы извлечь часть строки. Таким образом, из строки удаляются первые пять символов.

SET "VAR=AbC_d1344_454_78a"
SET "VAR=%VAR:~5%"
Но в этот момент у вас все еще есть альфа-символ в конце. Таким образом, вы можете выполнить простую команду findstr, чтобы увидеть, есть ли Альфа-символ в конце, и если да, то вы можете снова удалить его с помощью другой подстроки последний символ.
SET "var=AbC_d1344_454_78a"
SET "var=%var:~5%"
echo %var%|findstr /R /I /C:"[a-z]$">nul &&SET "var=%var:~0,-1%"

Другой вариант-использовать команду FOR /F и воспользоваться опцией DELIMS, чтобы разбить строку на отдельные переменные, используя символ подчеркивания в качестве разделителя. Вы можете получить все после первого подчеркивания, присвоенного переменной, подобной этой.

FOR /F "TOKENS=1* DELIMS=_" %%G IN ("AbC_d1344_454_78a") DO SET "var=%%H"
Но опять же, теперь у вас есть ведущий и замыкающий Альфа-символ. Таким образом, вы снова можете использовать команду FINDSTR для проверки этого и удаления ведущей и / или замыкающей Альфа-функции характер.
FOR /F "TOKENS=1* DELIMS=_" %%G IN ("AbC_d1344_454_78a") DO SET "var=%%H"
echo %var%|findstr /R /I /C:"^[a-z]">nul &&SET "var=%var:~1%"
echo %var%|findstr /R /I /C:"[a-z]$">nul &&SET "var=%var:~0,-1%"

Если у вас есть несколько начальных и конечных Альфа-символов, вы можете использовать метку и goto для продолжения итерации по команде FINDSTR.

FOR /F "TOKENS=1* DELIMS=_" %%G IN ("AbC_d1344_454_78a") DO SET "var=%%H"
:leading
echo %var%|findstr /R /I /C:"^[a-z]">nul &&(SET "var=%var:~1%" &GOTO leading)
:trailing
echo %var%|findstr /R /I /C:"[a-z]$">nul &&(SET "var=%var:~0,-1%" &GOTO trailing)

Меняйте местами любые примеры кода по своему усмотрению.

Еще Один Powershell

$entries = @('AbC_d1344_454_78a', 'Deg_e23_74_67') #example
$entries | %{[System.Text.RegularExpressions.Regex]::Match($_, '(\d[\d_]+\d)').Value}

В зависимости от форматирования входных данных вы можете перейти к более или менее строгому регулярному выражению, например (\d[\d_]*) или к чему-то более конкретному. Я советую использовать http://regexr.com экспериментировать с регулярным выражением.

Используя powershell, вы можете использовать

$regex = [regex] '(?m)\d[\d_]*'
$matchdetails = $regex.Match("AbC_d1344_454_78a. or Deg_e23_74_67")
while ($matchdetails.Success) {
    $matchdetails.Value
    $matchdetails = $matchdetails.NextMatch()
} 

Это поиск числа, за которым следует любое число чисел или подчеркиваний