正则表达式批处理

用户名

我在启用了二进制操作的cmd上编写计算器。我需要验证输入数据(删除算术运算不需要的字母和其他符号)

@echo off
set data=

echo %* | findstr /R "\/\? ECHO" > nul
IF "%ERRORLEVEL%" EQU "0" goto printHelp

:main
set data= %data%%1
shift

if "%1" == "" (
    echo %data% | findstr /R "^[0123456789*-+()/%!^_&|]*$" >nul 2>&1
    if "%ERRORLEVEL%" EQU 0 (
        echo Incorrect input data
        exit /B
    )

    goto :result
) else (
    goto :main
)

:result
    set /a data="%data%"
    echo %data%
    exit /B

:printHelp
    echo.
    echo --------------------------------------------------
    echo Using: calculator.bat [/?] [EXPRESSION]
    echo helps you to consider arithmetic in Command Line
    echo --------------------------------------------------
    exit /B

我的正则表达式不起作用。也不能视为二进制操作。可能是什么问题呢?

德本纳姆

第1部分-为什么您的“正则表达式不起作用”

  • 你的逻辑是错误的。如果存在匹配项,则FINDSTR将ERRORLEVEL设置为0,否则将其设置为1。您的正则表达式正在验证所有字符都是“有效”,但是您的条件是将匹配项视为错误输入。

  • 您的IF语句的一侧使用引号,但另一侧不使用引号。您必须保持一致,否则它将永远无法评估为TRUE。

  • 百分比文字必须在批处理脚本中加倍。您的regex有一个百分比文字,应写为%%

  • 您可以在用于设置该值的同一代码块中使用%ERRORLEVEL%。这是行不通的,因为在解析代码块时(在设置值之前)会扩展该值。

    最简单的选择是使用if errorlevel 1,如果ERRORLEVEL> = 1,则返回true。

    另一个选择是启用延迟扩展,顶部使用SETLOCAL ENABLEDELAYEDEXPANSION,然后使用if !errorlevel! neq 0但这需要!将正则表达式中带引号的文字转义为^!,而^文字转义为^^

    我最喜欢的选择是使用&&||条件运算符,而不是IF。

    findstr ... >nul && (match found statements) || (no match statements)

    对于您的情况,如果没有匹配项,您想采取措施,因此只需要||操作员。

第2部分-为什么您的整个概念不是一个好主意

  • 您的验证过于简单。仅仅筛选出无效字符并不能防止错误。例如,1**2即使所有字符都是“有效”,也将导致错误。还有许多其他带有“有效”字符的输入,将导致错误。

  • SET / A可以直接与环境变量一起使用。它知道如何在不扩展代码中值的情况下访问值。这可能是一个强大的工具。计算中使用的变量名可以包含不是运算符的任何字符。因此可以认为SET / A计算中没有无效字符。排除“无效”字符可防止在计算中使用变量。


以下是我前一段时间编写的一个简单的批处理计算器程序。它处于无休止的循环中,要求输入并显示结果,直到您输入quit命令为止。它支持SET / A支持的所有运算符。

它允许您在表达式中定义和使用变量。最新计算的结果始终存储在名为的变量中#

计算器可以将结果显示为十进制,十六进制或二进制。

默认情况下,它仅显示上一次计算的结果。可以指示在每次计算后还显示所有变量的值。

您可以输入命令而不是数学计算。所有命令均以\

\退出
\V切换变量列表,打开或关闭
\D十进制模式-结果显示为十进制
\H十六进制模式-结果显示为十六进制
\B二进制模式-结果显示为二进制
\C X清除变量X
\C *清除所有变量
\C X*清除所有以X开头的变量

不输入任何内容将列出所有当前定义的变量。

清除的变量未定义。请注意,未定义的变量的隐式值为0。

这是代码:

@echo off
setlocal enableDelayedExpansion
for /f "delims==" %%v in ('set') do set %%v=
set __skip=#COMSPEC#PATHEXT#PROMPT#__mode#__str#__skip#__clr###__dispVars#
set __mode=Dec
set __dispVars=0

:top
echo:
set __str=
set /p "__str=%__mode%> "
if "!__str!"=="\" exit /b
if "!__str!"=="" call :dispVar # & call :dispVars & goto :top
if /i "!__str:~0,2!"=="\C" call :clearVars &goto :top
if /i "!__str!"=="\H" (set __mode=Hex) ^
else if /i "!__str!"=="\D" (set __mode=Dec) ^
else if /i "!__str!"=="\B" (set __mode=Bin) ^
else if /i "!__str!"=="\V" (set /a "__dispVars=^!__dispVars") ^
else set /a #=(!__str!)
call :dispVar #
if !__dispVars! gtr 0 call :dispVars
goto :top

:clearVars
  for /f "delims=,; " %%v in ("!__str:~2!") do (
    set __clr=%%v
    if "!__clr:~-1!"=="*" (
      set __clr=!__clr:~0,-1!
      for /f "delims==" %%x in ('set !__clr!') do (
        if "!__skip:#%%x#=!"=="!__skip!" set "%%x="
      )
    ) else set "%%v="
  )
  call :dispVar #
  call :dispVars
exit /b

:dispVars
  setlocal
  for /f "tokens=1,2 delims==" %%v in ('set') do if "!__skip:#%%v#=!"=="!__skip!" call :dispVar %%v
exit /b

:dispVar Var
  setlocal
  if !__mode!==Hex call :num2hex %1 disp
  if !__mode!==Bin call :num2bin %1 disp
  if !__mode!==Dec set /a disp=!%~1!
  set var=%~1
  if "!var:~0,6!"=="!var!" (
    set "var=!var! ----------"
    set "var=!var:~0,6!"
  )
  echo %var% = !disp!
exit /b

:num2hex    NumVal RtnVar
  setlocal enabledelayedexpansion
  set hex=
  set /a "dec=%~1"
  set "map=0123456789ABCDEF"
  for /l %%n in (1,1,8) do (
    set /a "d=dec&15,dec>>=4"
    for %%d in (!d!) do set "hex=!map:~%%d,1!!hex!"
  )
  (endlocal & rem return values
    set %~2=%hex%
    exit /b
  )
exit /b

:num2bin    NumVal RtnVar
  setlocal enabledelayedexpansion
  set bin=
  set /a "dec=%~1"
  for /l %%n in (1,1,32) do (
    set /a "d=dec&1,dec>>=1"
    set "bin=!d!!bin!"
  )
  (endlocal & rem return values
    set %~2=%bin%
    exit /b
  )
exit /b

这是一个简短会议的结果:

D:\test>calculate.bat

Dec> 2*3
# ---- = 6

Dec> a=#+1
# ---- = 7

Dec>
# ---- = 7
a ---- = 7

Dec> b=(a+=5)*2
# ---- = 24

Dec> \v
# ---- = 24
a ---- = 12
b ---- = 24

Dec> c=b/3
# ---- = 8
a ---- = 12
b ---- = 24
c ---- = 8

Dec> \h
# ---- = 00000008
a ---- = 0000000C
b ---- = 00000018
c ---- = 00000008

Hex> \b
# ---- = 00000000000000000000000000001000
a ---- = 00000000000000000000000000001100
b ---- = 00000000000000000000000000011000
c ---- = 00000000000000000000000000001000

Bin> \

D:\test>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式批处理

来自分类Dev

批处理正则表达式中的换行

来自分类Dev

Windows批处理脚本:正则表达式或语句

来自分类Dev

批处理正则表达式中的换行

来自分类Dev

根据正则表达式选择行[批处理]

来自分类Dev

Windows批处理文件正则表达式

来自分类Dev

Python正则表达式处理“?”

来自分类Dev

处理复杂的正则表达式

来自分类Dev

处理嵌套正则表达式

来自分类Dev

Windows批处理文件中的正则表达式

来自分类Dev

正则表达式以匹配批处理脚本中的变量

来自分类Dev

使用批处理替换为正则表达式(Windows)

来自分类Dev

批处理-将变量与正则表达式进行比较

来自分类Dev

使用批处理和正则表达式重命名文件

来自分类Dev

在批处理文件中使用正则表达式

来自分类Dev

Windows批处理文件中的正则表达式

来自分类Dev

批处理文件使用正则表达式从字符串中提取数字?

来自分类Dev

使用批处理脚本,如何使用正则表达式拆分 .csv 文件中的数据?

来自分类Dev

批处理文件-删除名称与该正则表达式或该正则表达式匹配但不与该正则表达式匹配的文件

来自分类Dev

反正则表达式处理以生成正则表达式

来自分类Dev

使用正则表达式来处理日志文件:合并正则表达式

来自分类Dev

批处理:使用正则表达式将匹配的行从管道的输出返回到控制台

来自分类Dev

如何在 Windows 批处理文件中使用正则表达式查找特定模式?

来自分类Dev

PHP:处理所有正则表达式匹配

来自分类Dev

在正则表达式中处理特殊字符

来自分类Dev

正则表达式和文件处理

来自分类Dev

R中正则表达式的异常处理

来自分类Dev

处理Ping数据(正则表达式)

来自分类Dev

在替换中处理正则表达式匹配

Related 相关文章

  1. 1

    正则表达式批处理

  2. 2

    批处理正则表达式中的换行

  3. 3

    Windows批处理脚本:正则表达式或语句

  4. 4

    批处理正则表达式中的换行

  5. 5

    根据正则表达式选择行[批处理]

  6. 6

    Windows批处理文件正则表达式

  7. 7

    Python正则表达式处理“?”

  8. 8

    处理复杂的正则表达式

  9. 9

    处理嵌套正则表达式

  10. 10

    Windows批处理文件中的正则表达式

  11. 11

    正则表达式以匹配批处理脚本中的变量

  12. 12

    使用批处理替换为正则表达式(Windows)

  13. 13

    批处理-将变量与正则表达式进行比较

  14. 14

    使用批处理和正则表达式重命名文件

  15. 15

    在批处理文件中使用正则表达式

  16. 16

    Windows批处理文件中的正则表达式

  17. 17

    批处理文件使用正则表达式从字符串中提取数字?

  18. 18

    使用批处理脚本,如何使用正则表达式拆分 .csv 文件中的数据?

  19. 19

    批处理文件-删除名称与该正则表达式或该正则表达式匹配但不与该正则表达式匹配的文件

  20. 20

    反正则表达式处理以生成正则表达式

  21. 21

    使用正则表达式来处理日志文件:合并正则表达式

  22. 22

    批处理:使用正则表达式将匹配的行从管道的输出返回到控制台

  23. 23

    如何在 Windows 批处理文件中使用正则表达式查找特定模式?

  24. 24

    PHP:处理所有正则表达式匹配

  25. 25

    在正则表达式中处理特殊字符

  26. 26

    正则表达式和文件处理

  27. 27

    R中正则表达式的异常处理

  28. 28

    处理Ping数据(正则表达式)

  29. 29

    在替换中处理正则表达式匹配

热门标签

归档