Board logo

标题: 如何过滤变量中指定的字符[已解决] [打印本页]

作者: fornever     时间: 2006-8-30 21:41    标题: 如何过滤变量中指定的字符[已解决]

我想要实现的功能是在用户输入任意字符后过滤掉指定的字符
或者是指定使用的字符类型

请高手指教!

[ Last edited by fornever on 2006-9-16 at 22:03 ]
作者: NaturalJ0     时间: 2006-8-30 21:51
把 var 分两段
第一段是第一个字符,第二段是后面所有剩余的。
然后判断第一个字符是否要过滤。。。
然后判断剩下的字符串是否为空,如果不是就 GOTO 回上去继续循环。
作者: namejm     时间: 2006-8-30 22:51
Re fornever:

  过滤掉输入的字符是什么意思?就是在某个文本中把输入的字符删掉么?不明白你想做什么操作。
作者: fornever     时间: 2006-8-31 21:21
是这样,比如用copy con h.txt命令或者set /p 命令让用户输入任意字符,然后我在后台过滤掉指定的字符,也不是过滤,就是提示说哪个哪个字符不准使用.总之是要识别某种字符吧!偶语文ci,还原谅!~

re:NaturalJ0
在想如何分割一个字符串,包括数字字母和n多的符号,或者说是 规定只能用某种类型的字符,比如规定只能用字母和数字,
要怎么样实现?
或者借助第三方工具?
作者: NaturalJ0     时间: 2006-8-31 21:45
set /p var="请用户输入:"

%var:~0,1% 这表示的是变量 var 的第一个字符
%var:~1% 这表示变量 var 除第一个字符外的后面所有字符

分段后你可以再做赋值或比较什么的,可以再用这个方法对剩下的字符串再取第一个字符。后面再怎么做,我想你自己会的吧。
作者: fornever     时间: 2006-8-31 22:23
呵呵.刚学会在看回复前,不过还是谢谢哈!
批处理真的是博大精深,敬!
想想还是现在写一下代码:

set /p var=请输入:
:start
if "%var:~0,1%"=="?" goto error
if "%var:~0,1%"==">" goto error
if "%var:~0,1%"=="<" goto error
if "%var:~0,1%"=="|" goto error
:: if "%var:~0,1%"=="添加过滤的字符" goto error
if "var"=="" goto next
set var=%var:~1%
goto start
:next
echo succeed!
goto end
:error
echo error!
:end

再次感谢帮助过的朋友!
作者: namejm     时间: 2006-8-31 23:51
  批处理并不能检测所有的字符,碰到敏感字符如|、>、<等等就会自动退出的。
作者: vkill     时间: 2006-9-1 12:55
namejm 说的有理
作者: fornever     时间: 2006-9-1 18:36
...那用^符号可以吗?
其实我的目的是过滤掉那些不允许做文件名的字符
作者: fornever     时间: 2006-9-4 05:19    标题: 关于fingstr命令

其实还是上次的问题,不过今次不同的是要限制
限制set /p 后用户输入的字符为数字,大小写字母和特定的几个特殊符号
或者只限制某个类型的也可以!
作者: namejm     时间: 2006-9-5 07:18
  fingstr应该是findstr的笔误。

  上次?上次的在哪?如果不是有心人,没人会关注他人的上次发的究竟是什么帖子。呵呵,你的要求我看得一头雾水。
作者: fornever     时间: 2006-9-5 22:34
对不起 确实是
http://www.cn-dos.net/forum/view ... ge=1&highlight=
所谓的上次

意思是在用户输入字符串后用if 和findstr判断输入中是否有限制的字符

我想用findstr 限制输入的数据类型 为 大小写字母和数字
code:

set /p input:
::此处写findstr限制的%input:%类型
if ....
::此句if判断是否有不允许的字符类型,比如某些符号
作者: vkill     时间: 2006-9-6 02:28
这个难
作者: 9527     时间: 2006-9-6 02:53
findstr "^[a-z][A-Z]*$"   判断纯字母
findstr "^[0-9]*$"         判断纯数字

@echo off
set/p aa=Enter your code:
echo %aa%|findstr "^[a-z][A-Z]*$"||echo ERROR!!!

随便写了一下,判断纯字母,不知道楼主是否是这个意思???
作者: namejm     时间: 2006-9-6 02:57
  贴一段findstr的用法出来,楼主可以模仿着写个限制输入类型的代码出来:
             FINDSTR正则表达式的基本用法

1.findstr . 2.txt 或 Findstr "." 2.txt  
从文件2.txt中查找任意字符,不包括空字符或空行
====================

2.findstr .* 2.txt 或 findstr ".*" 2.txt
从文件2.txt中查找任意字符包括空行和空字符
====================

3.findstr "[0-9]" 2.txt
从文件2.txt中查找包括数字0-9的字符串或行
====================

4.findstr "[a-zA-Z]" 2.txt
从文件2.txt中查找包括任意字符的字符串或行
====================

5.findstr "[abcezy]" 2.txt
从文件2.txt中查找包括a b c e z y字母的字符串或行
====================

6.findstr "[a-fl-z]" 2.txt
从文件2.txt中查找小写字符a-f l-z的字符串,但不包含g h I j k这几个字母。
====================

7.findstr "M[abc][hig]Y" 2.txt
从文件2.txt中可以匹配 MahY , MbiY, MahY等…..
====================

8. ^和$符号的应用
^ 表示行首,"^step"仅匹配 "step hello world"中的第一个单词
$ 表示行尾,"step$"仅匹配 "hello world step"中最后一个单词
====================

9.finstr "[^0-9]" 2.txt
如果是纯数字的字符串或者行便过滤掉,例如2323423423 这样的字符串,如果是345hh888这样的形式就不成了。
====================

10.findstr "[^a-z]" 2.txt
同上,如果是纯字母的字符串或者行便过滤掉,例如 sdlfjlkjlksjdklfjlskdf这样的字符,如果是sdfksjdkf99999这样的形式,掺杂着数字就不成了
====================

11.*号的作用
前面已经说过了 ".*"表示搜索的条件是任意字符,*号在正则表达式中的作用不是任何字符,而是表示左侧字符或者表达式的重复次数,*号表示重复的次数为零次或者多次。
====================

12.findstr "^[0-9]*$" 2.txt
这个是匹配找到的纯数字,例如 234234234234,如果是2133234kkjl234就被过滤掉了。
   Findstr "^[a-z]*$" 2.txt
这个是匹配找到的纯字母,例如 sdfsdfsdfsdf,如果是213sldjfkljsdlk就被过滤掉了
如果在搜索条件里没有*号,也就是说不重复左侧的搜索条件,也就是[0-9] [a-z]那只能匹配字符串的第一个字符也只有这一个字符,因为有行首和行尾的限制,"^[0-9]$"第一个字符如果是数字就匹配,如果不是就过滤掉,如果字符串是 9 就匹配,如果是98或者9j之类的就不可以了。
=====================

13. "\<…\>"这个表达式的作用
这个表示精确查找一个字符串,\<sss 表示字的开始位置,sss\>表示字的结束位置
echo hello world computer|findstr "\<computer\>"这样的形式
echo hello worldcomputer|findstr "\<computer\>" 这样的形式就不成了,他要找的是 "computer"这个字符串,所以不可以。
echo hello worldcomputer|findstr ".*computer\>"这样就可以匹配了
=====================

作者: vkill     时间: 2006-9-6 03:04
楼上的这些很实用,收下
作者: fornever     时间: 2006-9-9 04:44
经过我实验用set name=| 是不可以的
但是用set /p name=input: 输入后是可以的 ,如图:
然后就可以用if语句一个一个字符判断了,这个的确可以做到我也实验成功了,可以过滤很多敏感字符,再结合findstr的限制就可以达到目的:规定输入为6~12个大写字母,小写字母,数字和符号_,其他符号过滤.要保证每一位都是前面的那些字符.
看我代码:

@setlocal
@set /p user=Input:
::过滤空字符以及不够六个字符的输入
@if "%user%"=="" goto error
@if "%user:~5,1%"=="" goto error
::过滤“|”号
@if "%user:~0,1%"=="|" goto error
@if "%user:~1,1%"=="|" goto error
@if "%user:~2,1%"=="|" goto error
@if "%user:~3,1%"=="|" goto error
@if "%user:~4,1%"=="|" goto error
@if "%user:~5,1%"=="|" goto error
@if "%user:~6,1%"=="|" goto error
@if "%user:~7,1%"=="|" goto error
@if "%user:~8,1%"=="|" goto error
@if "%user:~9,1%"=="|" goto error
@if "%user:~10,1%"=="|" goto error
@if "%user:~11,1%"=="|" goto error
::过滤其他敏感符号同上
::强制有效位为最多12位
@set user=%user:~0,12%
::限制输入字符为大写字母小写字符数字和_号
@echo %user% |findstr "[A-Za-z0-9_]"
@if errorlevel 1 goto error
@goto next
endlocal
:next
@echo succeed!
@goto end
:error
@echo Input error!
:end

但是有个符号 " 引号小弟不知道该怎么 办,怎么也过滤不掉郁闷,而且在输入中文的时候会提示过滤了,但是中文后面如果有英文字母的话就会成功通过过滤

这两点还请教各位大虾!
附件 1: 未命名.GIF (2006-9-9 04:44, 12.91 K, 下载附件所需积分 1点 ,下载次数: 4)



作者: fornever     时间: 2006-9-9 23:11
...... 没有人回复吗?
没有人会吗
斑竹给个答案啊
作者: fornever     时间: 2006-9-10 01:02
难道真的没有人会吗?!
作者: namejm     时间: 2006-9-10 23:03


  Quote:
Originally posted by fornever at 2006-9-9 04:45:
经过我实验用set name=| 是不可以的
但是用set /p name=input: 输入后是可以的 ,如图:
然后就可以用if语句一个一个字符判断了,这个的确可以做到我也实验戠...

  虽然在CMD命令行下输入是可以的,但是用在批处理中还是会出错。困惑中。
作者: 3742668     时间: 2006-9-10 23:43
Well,在批处理中赋值|到变量并非不可实现:
@echo off
    set "str=^|"
    echo %str%
pause
关于过滤字符,信手写出下面的代码, 希望能对需要的朋友有所帮助:
@echo off

:start
setlocal
    cls
    set /p var=请输入字符:
    call :filter "%var%"
endlocal
goto start

:filter
setlocal
    set "str=%~1★"
    set "str=%str:|=%"
    set "str=%str:&=%"
    set "str=%str:"=%"
    echo 过滤以后的字符为: %str:~0,-1%
    pause
endlocal
goto :eof
似乎可以过滤掉|,||,&,&&,",大家自行测试更改。
作者: namejm     时间: 2006-9-11 00:42
  3742668版主的代码用call来调用就可以过滤掉了,一时还真想不到

  第一种情况如果不加转义字符的话,在批处理中无法通过,但是却可以在CMD命令行下成功运行,我对这点还是挺纳闷的。
作者: fornever     时间: 2006-9-11 09:06


  Quote:
Originally posted by namejm at 2006-9-10 23:03:

  虽然在CMD命令行下输入是可以的,但是用在批处理中还是会出错。困惑中。

批处理中如果在 set /p user=input:下面跟上if 语句判断的话是通过的,如果没有IF的话也是不通过的,....想不通

而 set "str=|" 我在命令行下和批处理中都是通过的,难道和补丁有关>?

这个是我的补丁信息:

安装了 111 个修补程序。
[01]: File 1
[02]: File 1
[03]: File 1
[04]: File 1
[05]: File 1
[06]: File 1
[07]: File 1
[08]: File 1
[09]: File 1
[10]: File 1
[11]: File 1
[12]: File 1
[13]: File 1
[14]: File 1
[15]: File 1
[16]: File 1
[17]: File 1
[18]: File 1
[19]: File 1
[20]: File 1
[21]: File 1
[22]: File 1
[23]: File 1
[24]: File 1
[25]: File 1
[26]: File 1
[27]: File 1
[28]: File 1
[29]: File 1
[30]: File 1
[31]: File 1
[32]: File 1
[33]: File 1
[34]: File 1
[35]: File 1
[36]: File 1
[37]: File 1
[38]: File 1
[39]: File 1
[40]: File 1
[41]: File 1
[42]: File 1
[43]: File 1
[44]: File 1
[45]: File 1
[46]: File 1
[47]: File 1
[48]: File 1
[49]: File 1
[50]: File 1
[51]: File 1
[52]: File 1
[53]: File 1
[54]: File 1
[55]: Q147222
[56]: S867460 - Update
[57]: KB917734_WMP9
[58]: KB834707 - Update
[59]: KB873339 - Update
[60]: KB885835 - Update
[61]: KB885836 - Update
[62]: KB886185 - Update
[63]: KB886677 - Update
[64]: KB887472 - Update
[65]: KB888302 - Update
[66]: KB890046 - Update
[67]: KB890859 - Update
[68]: KB891781 - Update
[69]: KB893756 - Update
[70]: KB893803v2 - Updat
[71]: KB894391 - Update
[72]: KB896358 - Update
[73]: KB896423 - Update
[74]: KB896424 - Update
[75]: KB896428 - Update
[76]: KB898461 - Update
[77]: KB899587 - Update
[78]: KB899589 - Update
[79]: KB899591 - Update
[80]: KB900485 - Update
[81]: KB900725 - Update
[82]: KB901017 - Update
[83]: KB901190 - Update
[84]: KB901214 - Update
[85]: KB904706 - Update
[86]: KB905414 - Update
[87]: KB905749 - Update
[88]: KB908519 - Update
[89]: KB908531 - Update
[90]: KB910437 - Update
[91]: KB911280 - Update
[92]: KB911562 - Update
[93]: KB911567 - Update
[94]: KB911927 - Update
[95]: KB912919 - Update
[96]: KB913580 - Update
[97]: KB914388 - Update
[98]: KB914389 - Update
[99]: KB916595 - Update
[100]: KB917159 - Update
[101]: KB917344 - Update
[102]: KB917422 - Update
[103]: KB917953 - Update
[104]: KB918439 - Update
[105]: KB918899 - Update
[106]: KB920214 - Update
[107]: KB920670 - Update
[108]: KB920683 - Update
[109]: KB921398 - Update
[110]: KB921883 - Update
[111]: KB922616 - Update

[ Last edited by fornever on 2006-9-11 at 09:28 ]
作者: fornever     时间: 2006-9-11 09:45
RE 3742668:
小弟新手,你代码中很多不很理解
call :filter "%var%"
call到了 filter标签并用 var变量作为参数,可 在filter标签下并未有用到var变量啊?
set "str=%~1★"
还有上面一句的意思

谢谢!
作者: fornever     时间: 2006-9-11 09:49
我还有一个发现
就斑竹的代码我实验后,发现在输入字符时如果在把"&写在前面 ,那"&后面的所有字符都会忽略......能解释一下吗?
作者: 9527     时间: 2006-9-11 20:57
@echo off

:start
setlocal
    cls
    set /p var=请输入字符:
    call :filter "%var%"
endlocal
goto start

:filter
setlocal
    set "str=%~1★"
    set "str=%str:|=%"
    set "str=%str:&=%"
    set "str=%str:"=%"
    echo 过滤以后的字符为: %str:~0,-1%
    pause
endlocal
goto :eof



我来废话几句,call :filter "%var%" 这句是CALL调用过程执行相应代码,“%var%“ 是作为 %1 参数传递给执行代码的,版主主要是过滤掉了 | & “ 这三个字符,之所以用%str:~0,-1%来显示是因为开始的一句set "str=%~1★",把最后的那个五角星去掉而已.........
作者: zyyuser     时间: 2006-9-12 23:08
%Var:a=b%
把环境变量Var里的所有a替换为b
作者: namejm     时间: 2006-9-13 10:10
  今天楼主告诉我说,如果"和&连在一起的话,会把&及其之后的字符全部过滤掉,看来3742668版主的代码还有考虑不周的地方,特修改如下,可以避免这个问题:

  Quote:
@echo off

:start
setlocal
    cls
    set /p var=请输入字符:
    set "var=%var:"=%"
    call :filter "%var%"
endlocal
goto start

:filter
setlocal
    set "str=%~1★"
    set "str=%str:|=%"
    set "str=%str:&=%"
    set "str=%str:"=%"
    echo 过滤以后的字符为: %str:~0,-1%
    pause
endlocal
goto :eof

[ Last edited by namejm on 2006-9-13 at 10:11 ]
作者: fornever     时间: 2006-9-15 10:20
先要谢谢NAMEJM兄的无私帮助!
现在回想自己有些愚笨了,虽然最后和自己的最初设想有些出入,不过总算有解决办法了.
对于我的方法,其实主要是引号的问题,其他字符都可以顺利检查到.如果还按照我的初衷的话只需要在前面加一句set "var=%var:"=%"就可以搞定引号了.不过是做不到提示了,而是直接通过不过对字符做了处理(过滤了引号).这样的话只要用echo 说明出来就可以了.回头看自己的代码写出来后会是多么的臃肿,汗!

那结论就是了,如果你想要凝练的代码,那只用set "var=%var:"=%"过滤掉敏感字符,(主要是findstr语句敏感)然后用findstr "[A-Za-z0-9_]"加if errorlevel就可以直接限制了,不用去想剩下字符的情况了(有N多的符号,制表符什么的).
如果你想要出现错误有提示的话就用set /p var=input:后面家if "%var%"=="|" goto error 的语句跳转就好了.

就这些了吧,我想不起来了.还有什么情况大家一起来讨论哈!
解铃还需系铃人,哈哈!
作者: yangxixing     时间: 2007-11-22 23:13
收下学习了
作者: nipo     时间: 2008-5-11 02:03
此贴虽老不过时。
作者: mqw624     时间: 2010-12-6 18:31
学习中……