Expressão regular em lote

Expressão regular em lote

Eu tenho o seguinte código no powershell:

if($url -match "^https://www.youtube")

Como posso realizar a mesma verificação em lote, tentei com o seguinte, mas nada:

echo %url% | findstr "^https://www.youtube*$" >nul

if %url% == 0 (

echo la variables es correcta

) else (

echo la varaible no es correcta

)

Responder1

eu faria isso usandoexecução condicional:

cmd /V /C echo(!url!| findstr /I "^https://www\.youtube.\" > nul && (
    echo la variable es correcta
) || (
    echo la variable no es correcta
)

Porque:

  • você está verificando a variável errada ( if %url% == 0), você deve usar if %ErrorLevel% == 0or if %ErrorLevel% equ 0, ou mesmo if not ErrorLevel 1(o que também vale para ErrorLevelvalores menores que zero, mas findstrnão retorna de qualquer maneira); uma boa alternativa éexecução condicional;
  • echo %url%será problemático quando %url%contém caracteres especiais, portantoexpansão atrasadaé usado para evitar isso, habilitado porcmd /Ve aplicado por !url!em vez de %url%;
  • echopode ter problemas com certos valores de !url!, o que pode ser evitado escrevendo echo(!url!; também um rastro spacena frente do símbolo de barra vertical ( |) seria ecoado, portanto, basta removê-lo;
  • URLs geralmente não diferenciam maiúsculas de minúsculas, portanto, pesquise/compare também sem distinção entre maiúsculas e minúsculas, usandofindstr /I;
  • o .na URL deve ser um caractere literal, portanto, escape dele na string de pesquisa como \.;
  • o *$sufixo que você usou está errado, deveria ler .*$, mas não é necessário de qualquer maneira; Eu acrescentaria um ponto literal ( \.) para não corresponder a algo como https://www.youtubefake.net/, por exemplo;

Responder2

Bem-vindo ao Superusuário.

Se você está tentando confirmar se algum texto começa com "https://www.youtube", você não precisa do *$no final. E não sei por que você está comparando %url% == 0depois de fazer o findstr. Verificar o errorlevelindicará o que você deseja saber. Este código faz o que acho que você está tentando realizar.

SET /p url=Enter a URL:

echo %url% | findstr "^https://www.youtube" >nul

if errorlevel 1 (

echo la varaible no es correcta

) else (

echo la variables es correcta

)

Responder3

Pelo seu exemplo, não parece que você precisa de uma expressão regular real. Você pode usar a substituição simples de string para saber se uma string está em outra string.

if "%url:https://www.youtube=%"=="%url%" ( 
    echo variable is not in string 
) else ( 
    echo variable is in string 
)

A sintaxe é %VAR_NAME:SEARCH_STRING=REPLACE_STRING%

O que estamos dizendo aqui:

  1. Substituto "https://www.youtube" sem nada na variável chamadaurl
  2. Compare-o com aquele que não teve a substituição feita.
  3. Se forem iguais, a string "https://www.youtube"não estava na variável.

Ressalvas:

Este método não fornece a funcionalidade que a âncora "^" oferecia no PowerShell. Se a variávelcontém"https://www.youtube"em qualquer lugar, sua correspondência será inválida.. por exemplo.."https://www.senorsuerte.com/value?https://www.youtube"produziria um sucesso quando não é isso que você pretende fazer.

Este caso também é fácil de corrigir, pré-pendendo um caractere inválido no início de cada uma das strings que estamos testando.

if "*%url:https://www.youtube=%"=="*%url%" ( 
    echo variable is not in string 
) else ( 
    echo variable is in string 
)

Observe o “*” no início de cada string. O "*" não é mágico. Ele apenas ancora nossa consulta no início da string e pode ser QUALQUER caractere.

informação relacionada