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/viewthread.php?tid=22897&fpage=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 "" 2.txt
从文件2.txt中查找包括数字0-9的字符串或行
====================

4.findstr "" 2.txt
从文件2.txt中查找包括任意字符的字符串或行
====================

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

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

7.findstr "MY" 2.txt
从文件2.txt中可以匹配 MahY , MbiY, MahY等…..
====================

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

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

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

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

12.findstr "^*$" 2.txt
这个是匹配找到的纯数字,例如 234234234234,如果是2133234kkjl234就被过滤掉了。
Findstr "^*$" 2.txt
这个是匹配找到的纯字母,例如 sdfsdfsdfsdf,如果是213sldjfkljsdlk就被过滤掉了
如果在搜索条件里没有*号,也就是说不重复左侧的搜索条件,也就是 那只能匹配字符串的第一个字符也只有这一个字符,因为有行首和行尾的限制,"^$"第一个字符如果是数字就匹配,如果不是就过滤掉,如果字符串是 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 KiB, 下载附件所需积分 1点 ,下载次数: 4)



作者: fornever     时间: 2006-9-9 23:11
...... 没有人回复吗?
没有人会吗
斑竹给个答案啊

作者: fornever     时间: 2006-9-10 01:02
难道真的没有人会吗?!

作者: namejm     时间: 2006-9-10 23:03
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
Originally posted by namejm at 2006-9-10 23:03:

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


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

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

这个是我的补丁信息:

安装了 111 个修补程序。
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: File 1
: Q147222
: S867460 - Update
: KB917734_WMP9
: KB834707 - Update
: KB873339 - Update
: KB885835 - Update
: KB885836 - Update
: KB886185 - Update
: KB886677 - Update
: KB887472 - Update
: KB888302 - Update
: KB890046 - Update
: KB890859 - Update
: KB891781 - Update
: KB893756 - Update
: KB893803v2 - Updat
: KB894391 - Update
: KB896358 - Update
: KB896423 - Update
: KB896424 - Update
: KB896428 - Update
: KB898461 - Update
: KB899587 - Update
: KB899589 - Update
: KB899591 - Update
: KB900485 - Update
: KB900725 - Update
: KB901017 - Update
: KB901190 - Update
: KB901214 - Update
: KB904706 - Update
: KB905414 - Update
: KB905749 - Update
: KB908519 - Update
: KB908531 - Update
: KB910437 - Update
: KB911280 - Update
: KB911562 - Update
: KB911567 - Update
: KB911927 - Update
: KB912919 - Update
: KB913580 - Update
: KB914388 - Update
: KB914389 - Update
: KB916595 - Update
: KB917159 - Update
: KB917344 - Update
: KB917422 - Update
: KB917953 - Update
: KB918439 - Update
: KB918899 - Update
: KB920214 - Update
: KB920670 - Update
: KB920683 - Update
: KB921398 - Update
: KB921883 - Update
: 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版主的代码还有考虑不周的地方,特修改如下,可以避免这个问题:

@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
学习中……