Извлечение подстроки из строки с помощью пакета
Мне нужно извлечь подстроку (числовую с подчеркиванием) из строки с помощью пакетного файла. Например:
У меня есть AbC_d1344_454_78a. или Deg_e23_74_67.
Я хочу извлечь подстроки 1344_454_78 и 23_74_67.
3 ответа:
У вас есть несколько решений с пакетным файлом.
Если ваши данные всегда имеют одинаковое количество символов перед числами, вы можете сделать простую подстроку, чтобы извлечь часть строки. Таким образом, из строки удаляются первые пять символов.
Но в этот момент у вас все еще есть альфа-символ в конце. Таким образом, вы можете выполнить простую команду findstr, чтобы увидеть, есть ли Альфа-символ в конце, и если да, то вы можете снова удалить его с помощью другой подстроки последний символ.SET "VAR=AbC_d1344_454_78a" SET "VAR=%VAR:~5%"
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, чтобы разбить строку на отдельные переменные, используя символ подчеркивания в качестве разделителя. Вы можете получить все после первого подчеркивания, присвоенного переменной, подобной этой.
Но опять же, теперь у вас есть ведущий и замыкающий Альфа-символ. Таким образом, вы снова можете использовать команду FINDSTR для проверки этого и удаления ведущей и / или замыкающей Альфа-функции характер.FOR /F "TOKENS=1* DELIMS=_" %%G IN ("AbC_d1344_454_78a") DO SET "var=%%H"
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() }
Это поиск числа, за которым следует любое число чисел или подчеркиваний