Expresión regular en lotes

Expresión regular en lotes

Tengo el siguiente código en powershell:

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

Como puedo realizar la misma verificación en lotes, probé con lo siguiente pero nada:

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

if %url% == 0 (

echo la variables es correcta

) else (

echo la varaible no es correcta

)

Respuesta1

yo lo haría usandoejecución condicional:

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

Porque:

  • está verificando la variable incorrecta ( if %url% == 0), debe usar if %ErrorLevel% == 0o if %ErrorLevel% equ 0, o incluso if not ErrorLevel 1(lo cual también es cierto para ErrorLevelvalores menores que cero, pero findstrno los devuelve de todos modos); una buena alternativa esejecución condicional;
  • echo %url%será problemático cuando %url%contenga caracteres especiales, por lo tantoexpansión retrasadase utiliza para evitar eso, habilitado porcmd /Vy aplicado por !url!en lugar de %url%;
  • echopodría tener problemas con ciertos valores de !url!, lo cual se puede evitar escribiendo echo(!url!; también se repetirá un final spacedelante del símbolo de tubería ( |), por lo tanto, simplemente elimínelo;
  • Las URL generalmente no distinguen entre mayúsculas y minúsculas, por lo tanto, busque/compare también sin distinguir entre mayúsculas y minúsculas, usandofindstr /I;
  • en .la URL debe ser un carácter literal, por lo tanto, escape en la cadena de búsqueda como \.;
  • el *$sufijo que usaste es incorrecto, debería decir .*$, pero de todos modos no es necesario; Sin embargo , agregaría un punto literal ( \.) para que no coincida con algo como https://www.youtubefake.net/, por ejemplo;

Respuesta2

Bienvenido a Superusuario.

Si está intentando confirmar que algún texto comienza con "https://www.youtube", no necesitas el *$al final. Y no estoy seguro de por qué estás comparando %url% == 0después de hacer el findstr. Verificar errorlevelte dirá lo que quieres saber. Este código hace lo que creo que estás tratando de lograr.

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

)

Respuesta3

Según su ejemplo, no parece que necesite una expresión regular real. Puede utilizar la sustitución de cadenas simples para saber si una cadena está en otra cadena.

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

La sintaxis es %VAR_NAME:SEARCH_STRING=REPLACE_STRING%

Lo que estamos diciendo aquí:

  1. Sustituto "https://www.youtube"sin nada en la variable nombradaURL
  2. Compárelo con uno al que no se le haya realizado la sustitución.
  3. Si son iguales, la cadena "https://www.youtube" no estaba en la variable.

Advertencias:

Este método no proporciona la funcionalidad que ofrecía el ancla "^" en PowerShell. Si la variablecontiene"https://www.youtube"En cualquier lugar, tu coincidencia no será válida... por ejemplo..."https://www.senorsuerte.com/value?https://www.youtube"produciría un éxito cuando eso no es lo que pretendes hacer.

Este caso también es fácil de solucionar anteponiendo un carácter no válido al principio de cada una de las cadenas que estamos probando.

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

Tenga en cuenta el "*" al principio de cada cadena. El "*" no es mágico... simplemente ancla nuestra consulta al principio de la cadena y podría ser CUALQUIER carácter.

información relacionada