Есть ли способ удалить все, кроме алфавитов и цифр из строки? - PullRequest
0 голосов
/ 04 октября 2018

Я хочу убедиться, что существует какой-либо метод удаления всех символов, кроме алфавитов и цифр (и пробелов) из %variable%?надеюсь, не отбрасывая каждого из них, а выбирая персонажей для сохранения, потому что это может быть более легкой задачей.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Проблема в том, что строка должна быть обработана символ за символом .Мы можем использовать интересный трюк, который может отделить каждый символ в строке.Метод заключается в запуске отдельного экземпляра cmd.exe с переключателем /U, поэтому за каждым символом следует двоичный ноль.После этого используйте команду find /V "", чтобы получить каждую пару символ-ноль как отдельные строки.

Наконец, просто проверьте, находится ли символ в переменной keep, и игнорируйте в противном случае.Метод также проверяет наличие специальных символов, которые нельзя напрямую обработать при замене строки: !=*.

@echo off
setlocal EnableDelayedExpansion

set "input=Any ^!string#& /with ()=special*{ }characters..."
echo Input:  "!input!"

set "keep=abcdefghijklmnopqrstuvwxyz 0123456789"
set "output="
for /F "delims=" %%a in ('cmd /U /C set /P "=!input!" ^<NUL ^| find /V ""') do (
   if "%%a" neq "^!" if "%%a" neq "=" if "%%a" neq "*" (
      if "!keep:%%a=!" neq "%keep%" (
         set "output=!output!%%a"
      )
   )
)

echo Output: "%output%"

Пример вывода:

Input:  "Any !string#& /with ()=special*{ }characters..."
Output: "Any string with special characters"
0 голосов
/ 05 октября 2018

Если вы пытаетесь удалить определенные символы или символы из строки, мы можем использовать findstr с переключателем /V на , исключая эти переменные из оператора.

Проблема с этим заключается в том, что он увидит персонажа в зачете и удалит все это вместе.Чтобы обойти это, ряд статистических данных может разбить строку и программно создать цепочку команд findstar для автоматического запрета нужных вам персонажей.

Например, нижеприведенная команда будет брать символы из A,B,C,D отформатируйте и создайте строку ^| find /V "A" + ^| find /V "B" + ^| find /V "C" + ^| find /V "D" для каждого символа "Banned".

for /F "delims=" %%a in ("%BAN%") do (
    set "output="
    for /F "delims=" %%b in ('cmd /U /C echo %%a^| find /V ","^| find /V "*"') do (
        set "output=!output! | find /V "%%b""
    )
    set "B1=!output:~1!"
)

Здесь мы можем использовать эти данные и ввести их вдругой для утверждения, чтобы исключить тех, кто в findstr /V.Помните, что каждый блок разбивает каждый символ в отдельной строке для последующего добавления в один символ в этом блоке.

Весь этот процесс можно вызвать с помощью оператора call с %1.В моем решении все, что вам нужно сделать, это использовать CALL :FIX (STRING NAME), и он пройдет, удалит запрещенные символы и изменит эту строку, чтобы не было этих символов.

@ECHO OFF
setlocal EnableDelayedExpansion

rem | Banned character List (Must be in A,B,C format)
set "BAN=m,1,4,)"

rem | TEST strings we want to remove symbols from (Can be any name)
SET "STRING1=H$4jm)k@14+d^j"
SET "STRING2=money"

rem | Use (CALL) (:FIX) (STRING NAME)
echo BEFORE FIX: %STRING1%
call :FIX STRING1
echo AFTER FIX: %STRING1%

pause
goto :eof

:FIX
Rem | Create %1 into raw string & string data
set "VAR1=%1"

Rem | Create a Findstr for each banned character
for /F "delims=" %%a in ("%BAN%") do (
    set "output="
    for /F "delims=" %%b in ('cmd /U /C echo %%a^| find /V ","') do (
        set "output=!output! | find /V "%%b""
    )
    set "B1=!output:~1!"
)

Rem | Edit string without banned words
for /F "delims=" %%a in ("!%VAR1%!") do (
    set "output="
    for /F "delims=" %%b in ('cmd /U /C echo %%a^| find /V ""!B1!') do (
        set "output=!output! %%b"
    )
    set "B2=!output:~1!"
)
Rem | Remove spaces & finish
set %VAR1%=!B2: =%!
goto :eof
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...