3 votes

Comment détecter si l'entrée est une citation ?

J'ai le code suivant

if "%userInput%"==""" (
    do_something
)

Je voudrais qu'il détecte si le %userInput% est un citation( " ). Cependant, ce code génère une erreur.

Comment détecter si l'entrée est un citation ?

5voto

Stephan Points 6585

Comme vous l'avez demandé "si l'entrée contient une citation". Juste find il :

set "i=hello " world"
set i|find """" >nul && echo yes || echo no

Note : echo %i%|find """" peut ne pas fonctionner avec des guillemets non appariés, mais set ne s'en soucie pas.

Notez le """" (l'aspect est étrange et peu intuitif). find ne semble pas utiliser l'échappement habituel : find "^"" donne une erreur de syntaxe.

3voto

npocmaka Points 7794

Avec une variable supplémentaire et une expansion retardée :

@echo off

set /p quote=Enter quote
set "test_quote=""
setlocal enableDelayedExpansion

if !quote! equ !test_quote! echo equal

3voto

dbenham Points 46458

Voici une solution sans expansion retardée qui devrait fonctionner avec n'importe quelle entrée, y compris les espaces et les caractères empoisonnés. Mon code de test est dans une boucle. Lorsque vous êtes prêt à quitter, appuyez simplement sur <Enter> sans avoir à taper quoi que ce soit.

@echo off
setlocal

:loop
set "var="
set /p "var=enter a string: "
if not defined var exit /b

if "%var:"=""%" == """" echo equals quote

echo(
goto loop

L'astuce devrait être assez évidente. Mettez la valeur entre guillemets, et doublez tous les guillemets internes pendant l'expansion, de sorte que tous les délimiteurs de jetons et les caractères de poison soient garantis d'être entre guillemets. Bien sûr, sur le côté droit, vous devez inclure les guillemets internes, plus le guillemet doublé que vous essayez de faire correspondre (pour un total de 4).

Si vous devez être en mesure de faire passer toutes les entrées (y compris l'absence de valeur) par le test IF, vous pouvez définir une variable de test. Quelque chose comme ce qui suit (en supposant que var contient déjà l'entrée de l'utilisateur)

set "test="
if defined var set "test=%var:"=""%"
if "%test%" == """" echo equals quote

Solution alternative utilisant FINDSTR

J'ai été inspiré par Réponse de Stephan pour trouver une solution alternative utilisant FINDSTR qui ne nécessite pas d'expansion retardée. Il a interprété la question différemment, répondant à la question "La valeur d'entrée contient-elle un guillemet à un endroit quelconque ?", et a résolu cette question en utilisant FIND.

Mais FIND ne peut pas déterminer si l'entrée correspond exactement à un caractère guillemet simple.

Un simple "one liner" avec FINDSTR peut résoudre ce problème.

2>nul set var|findstr /x ^"var=\"" >nul && echo equals quote

ou

2>nul set var|findstr /x "var=\"^" >nul && echo equals quote

Notez que FINDSTR exige généralement que les guillemets soient échappés en tant que \" et l'analyseur syntaxique de lot exige que l'un des guillemets soit échappé en tant que ^" parce qu'il y a un nombre impair de guillemets. Si un guillemet n'est pas échappé, alors le reste de la ligne est considéré comme faisant partie de la chaîne de caractères au lieu des opérations de redirection et d'exécution conditionnelle.

Notez également qu'avec l'analyseur batch, il est impossible d'échapper à une citation une fois celle-ci activée. La phrase suivante ne fonctionne donc PAS

2>nul set var|findstr /x "var=\^"" >nul && echo equals quote THIS DOES NOT WORK

2voto

Compo Points 15485

Et peut-être sans expansion retardée :

@Echo Off
Set/P "input=Please input a character: "
If [^%input%]==[^"] (Echo it is a quote) Else Echo it is something else
Timeout -1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X