Board logo

标题: [原创] 批处理字符截取心得,吐血总结出一口诀! [打印本页]

作者: xouou_53320    时间: 2009-11-10 21:17     标题: 批处理字符截取心得,吐血总结出一口诀!

首先感谢论坛里的这位大侠给我们做了个关于字符截取的演示,
以前我也看过了一些资料中也有讲到字符截取的内容
但是真的对我们这些新手来说 。。。很晕啊
 而且我平时很少研究这东西 想要用的时候不知道咋办 怎么也高不会
幸好前几天对下面照这张表 才算勉强不出错  要是没有这张表又不会了

我凝神细看了N久 我就不信这是东东没有规律的

然后么终于有了这篇帖子

以上是废话 ~~ haha


=======================


第一屏 舍弃

                var=1234567890
%var:~1%        舍弃var的前1位                      234567890      
%var:~2%        舍弃var的前2位                      34567890       
%var:~3%        舍弃var的前3位                      4567890        
%var:~0,1%      舍弃var的前0位之后取1位             1              
%var:~0,2%      舍弃var的前0位之后取2位             12             
%var:~0,3%      舍弃var的前0位之后取3位             123            
%var:~1,1%      舍弃var的前1位之后取1位             2              
%var:~1,2%      舍弃var的前1位之后取2位             23             
%var:~1,3%      舍弃var的前1位之后取3位             234            

%var:~0,-1%     舍弃var的前0位和-1位                123456789      
%var:~0,-2%     舍弃var的前0位和-2位                12345678       
%var:~0,-3%     舍弃var的前0位和-3位                1234567        

%var:~1,-1%     舍弃var的前1位和-1位                23456789       
%var:~1,-2%     舍弃var的前1位和-2位                2345678        
%var:~1,-3%     舍弃var的前1位和-3位                234567         

%var:~2,-1%     舍弃var的前2位和-1位                3456789        
%var:~2,-2%     舍弃var的前2位和-2位                345678         
%var:~2,-3%     舍弃var的前2位和-3位                34567          

~ 波浪号后面的数字:为正数表示舍弃变量的前位;
, 逗号后面的数字为正数表示取变量的舍弃以后的前几位;
, 逗号后面为负数表示舍弃变量的后几位

请按任意键继续. . .  
第二屏 取
                var=1234567890
%var:~-1%       取var的最后1位                      0              
%var:~-2%       取var的最后2位                      90             
%var:~-3%       取var的最后3位                      890            
%var:~-4,1%     从var的倒数4位开始取1位             7              
%var:~-4,2%     从var的倒数4位开始取2位             78             
%var:~-4,3%     从var的倒数4位开始取3位             789            

%var:~-5,1%     从var的倒数5位开始取1位             6              
%var:~-5,2%     从var的倒数5位开始取2位             67             
%var:~-5,3%     从var的倒数5位开始取3位             678            

%var:~-6,1%     从var的倒数6位开始取1位             5              
%var:~-6,2%     从var的倒数6位开始取2位             56             
%var:~-6,3%     从var的倒数6位开始取3位             567            

%var:~-8,-1%    从var的倒数8位开始并舍弃最后-1位    3456789        
%var:~-8,-2%    从var的倒数8位开始并舍弃最后-2位    345678         
%var:~-8,-3%    从var的倒数8位开始并舍弃最后-3位    34567       

               1234567890


==============================
总结1:

%var:~数字%    =        %var:~数字,0%           就是说当逗号后面是0的时候可以省略


总结2:
我们来看其中的 ( 数字 逗号 数字) 部分    即 比如(-6,2)     [要是输入的是中文逗号 那是错误输入,废话]


口诀:                  正数正向右截断,负数反向左截断。
                            左边截断丢左边 ,右边截断丢右边。

口诀中我们称      -6    为         负数  或   左边   (这个数在逗号左边嘛)
                            2   为         正数  或   右边    (这个数在逗号右边嘛)

 正向就是向右, 反向就是向左  , 这是我们的惯性思维 ,不难理解吧。

数据截断为两半后把不要的数据丢弃, (注:是一律丢弃 删除   而不要分什么 取 还是 丢   ,我们一律丢。)

至于丢哪个部分呢?  看口诀,口诀中说了,你这个数字 -6 本来在 逗号左边的, 截断后丢弃左边  ,2 本来在逗号右边的就丢弃右边

先看 -6,   是负数我们往反向向左截断6位,就是     1234,567890    然后看-6在逗号左边就把左边的1234丢弃   剩余567890

再看 2,    是正数我们往正向向右截断2位,就是     56,7890             然后看2在逗号右边就把右边的7890丢弃   剩余56


全部是惯性思维, 一旦理解明白记住,这辈子别想忘了!    哈哈~~   好了 从上表中挑几个试试吧  

菜鸟的总结  要是说的不对  大家别骂  啊      交流交流嘛
作者: tevktev    时间: 2009-11-10 21:45

楼主总结得好快啊,我也刚学批处理,看贴子时,
也被set %path:~x,y%弄得头晕,看过一篇好帖明白了不少。
又看完楼主的记忆的更深了,谢谢。。
作者: netbenton    时间: 2009-11-10 21:54

%str:~N,M%

N,M均为正数时:从第N位开始,取M个字符
-N,-M均为负数时:取倒数第N位开始,到倒数第M位为止的字符
-N,M时:从倒数第N位开始,取M个字符
N,-M时:取第N位开始,到倒数第M位为止的字符

N缺省时:%str:~,M%
相当于N为0

M缺省时:%str:~N%
相当于M为无限大,即不管串多长,均到串的尾部

*******注意字符位置从0位开始*******
作者: xouou_53320    时间: 2009-11-10 23:21

正数正向截 负数反向截
左边丢左边 右边丢右边
作者: zqz0012005    时间: 2009-11-10 23:36

cn-dos上关于字符截取的帖子一坨坨的。。。

%var:~m, n%
m是偏移量,n指定要截取的长度。
“如果两个数字(偏移量和长度)都是负数,使用的数字则是环境变量数值长度加上指定的偏移量或长度”(参见set /?)
m、n是负数时,很容易可以计算出,变量数值长度加上指定的偏移量或长度,截取的正好是倒数第|m|个到倒数第|n|个为止的字符。
偏移量是指相对第一个字符的位置,所以第一个字符的偏移量正好是零,第二个是1…

注意建立偏移量的概念,什么都好理解。编程语言中一个很普遍而基础的概念。
很基础而自然的东西,完全不需要什么总结。
作者: xouou_53320    时间: 2009-11-11 01:26

原帖由 zqz0012005 于 2009-11-10 23:36 发表
cn-dos上关于字符截取的帖子一坨坨的。。。

%var:~m, n%
m是偏移量,n指定要截取的长度。
“如果两个数字(偏移量和长度)都是负数,使用的数字则是环境变量数值长度加上指定的偏移量或长度”(参见set /?)
m、 ...


恩 你也说了为什么字符截取的帖子一坨坨的,,, 那到底是为什么呢??、
m是偏移量,n指定要截取的长度。 看过这句话的人谁不知道          所以我在帖子里提都没提

关键是怎么搞才能快速准确的截取,而且永远不忘

这就像小学的时候 很多人都是先背乘法口诀  比如七八五十六      先背出来了    才能知道 7*8=56

可要是不背口诀   他也明明知道5*8=40  就是不知道7*8=56  或者可能还要算好一会  40+8   +8 

而背熟口诀了 还会不知道吗  本来5秒算出来的 而且容易错    现在只要1秒  而且肯定对

相信论坛里也有很多像我一样的菜鸟的 大家总结总结交流交流还是挺好的嘛

[ 本帖最后由 xouou_53320 于 2009-11-11 02:04 编辑 ]
作者: zqz0012005    时间: 2009-11-11 01:58     标题: 回复 6楼 的帖子

m是偏移量,n指定要截取的长度。
记住这一句难道不比你说的那些口诀有用吗?

之所以那么多人提问,其实很多人都是被误导了,反而忘了最本质的东西。像偏移量,很多人根本没有这个概念(虽然这在一定程度上与所掌握的计算机知识有关)。
作者: xouou_53320    时间: 2009-11-11 02:06

偏移量其实还好
像c语言里的多维数组才容易出错   从第0个开始,,,,
作者: 风行者    时间: 2009-11-11 12:14

版主说得好,只要理解,偏移量和长度两个概念!变量截取其实就是一个计算过程,明白了就是一法通万千变化在心中
作者: zqz0012005    时间: 2009-11-11 12:17

关于m,字符串作为指针时就是偏移量,作为字符数组就是下标。
当然下标的本质就是偏移量。
fwrite("www.bathome.net"+4, 7, 1, stdout);

fwrite(&"www.bathome.net"[4], 7, 1, stdout);

作者: netbenton    时间: 2009-11-11 13:08

%str:~,%
上式中,认为是取两偏移点间的字符,需要这样理解:

1,NM都可以说是偏移,正为正向偏移,负为反向偏移,

2,但是NM的基点有区别:
N为正时,基点为0,  为负时,基点为串尾
M为正时,基点为N位置(注意:是N,不是0,  为负时,基点为串尾

N为空时,相当于,N=0,M为空时,相当于M=负0,即反向0偏移,或者认为是正向的无限大,即到串尾

例:如果%str%变量只有10个字符,
       则%str:~3,1000%和%str:~3%结果是一样的

[ 本帖最后由 netbenton 于 2009-11-11 13:14 编辑 ]
作者: xouou_53320    时间: 2009-11-11 20:31

注意:是N,不是0
这句话很重要
作者: zqz0012005    时间: 2009-11-12 11:43


%str:~m,n%
len = strlen(str)
m是偏移量,n指定要截取的长度,len是原字符串的长度。
正确的计算方法是:
    ┌, m≥0
m=M=│
    └len+m, m<0 => M=0, if "len+m" is still less than zero(that is while m<-len)

    ┌, n≥0
n=N=│
    └len+n-, n<0(Note here is M, after previous calculation) => N=0, if "len+n-M" is still less than zero

正好推算出,当长度n为负数时,截取字符的终点是倒数第∣n∣个字符之前(不包括此字符)

%str:~m,n% → %str:~M,N%
如果截取长度为零,显然截取结果为空字符串。
=> 长度n为负数时,如果倒数第∣n∣个字符在偏移量前面(=>∣n∣>),则截取长度为0(空字符串)。
=> m,n都为负数时,如果∣n∣>∣m∣,截取长度为0(空字符串)。

命令自带文档:“如果两个数字(偏移量和长度)都是负数,使用的数字则是环境变量数值长度加上指定的偏移量或长度。”
不只翻译有误,英文原文是:
If either number (offset or length) is negative, then the number used is the length of the environment variable value added to the offset or length specified.

文档中对偏移量offset的说明是正确的,而长度length的计算方法不完整。在实际使用中虽然一直是用正确方法,但没怎么注意到文档,原来真的是文档有误,难怪新手不太明白。


[ 本帖最后由 zqz0012005 于 2009-11-13 12:32 编辑 ]
作者: 594850072    时间: 2012-1-23 16:55

学习了     楼主的发放也不是没有道理 对新手来说是很简单的
作者: hnzz110    时间: 2013-5-28 22:54

1楼帖子显示不正常?
作者: system_fans    时间: 2013-7-26 15:07

看着一大堆的   我好像蒙了




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2