中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: [讨论]关于字符串 上一主题 | 下一主题
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『楼 主』:  [讨论]关于字符串

文/523066680
blog:  http://hi.baidu.com/523066680
首发于:http://www.cn-dos.net/forum/viewthread.php?tid=45654&fpage=1

写这文章的原因:
    看了一些关于字符串处理的帖子,觉得方法可以改进。另外,本人的签名...  为了让更多的人看见
所以必须多发文章,而且不能尽是水。

主要内容:
    1.抓了几道题目,解题,觉得见得人的就摆上来了。

    2.set截取字符串另解

---------------------------------几道题------------------------------------
[题目a]       在群里有人问到,如何简单地判断字符串的长度?
         (我确有另解,只是不通用罢了,于是问问条件) "比如说?"
         "比如变量值 1 或123 我要判断有几个字符"(ok,简单短小的字符串,我包了)
    测试代码1:
        @echo off
        set str=exist
        set n=%str%9876543210
        echo,%str% 字符个数为 %n:~9,1% 个
        pause
      
可使用的情况: 字符数量在 0~9个的范围 的时候

    这个方法是不通用的,但是有的问题本来就简单,何不简单地解决?
所以我提倡:特殊问题,特殊对待。

    应用举例:可以判断某9位以内 数字位数;
              00N式重命名的时候,判断位数并补适当位数的零

   顺便贴一个 按文件个数批量00N重命名 的例子吧,思路不全同,但类似
@echo off
title code by 523066680 @ cn-dos.net
if not exist *.jpg (echo,不存在jpg文件&pause>nul&exit)

setlocal enabledelayedexpansion
::判断文件数位数,决定名字前面补0的最大个数.文件数不能多于9位数.
for %%a in (*.jpg) do set /a a+=1
set "a=%a%987654321" & set "o=0000000000"
set /a k=0
for /f "tokens=*" %%a in ('dir *.jpg /b') do (
  set /a k+=1
  set name=%o%!k!
  ren "%%a" "0!name:~-%a:~9,1%!.jpg"
  echo,0!name:~-%a:~9,1%!
)
     
不小心发现 包括上面和好多 BatchRen都有的一个bug ~  dir会把名字排序并列出,但是...
比如存在 0.jpg 1.jpg 第一次ren 0.jpg 为1.jpg 时...就会出错.
这里不讨论这个了.(临时对策,先ren *.jpg *.jpg# 然后再for逐个ren "xx.jpg#" "编号.jpg")

(下面只贴了标题,没有链接sorry 我是单机用户,在精华帖2008看到以下内容.....)

[题目2]  标题: 如何检查一字符串中相同字符的个数            

         --------------------------------------------------------------------------------
         作者: huahua0919     时间: 2008-4-12 19:13    标题: 如何检查一字符串中相同字符的个数

         set string=aferefwfwerergrgreaaffwafwa
         用bat怎么检查以上字符串中字符a出现的次数(可不能用字符截取功能)

重新看下,   
超级郁闷。。。。。。原来最后追的帖 思路和我的一样,怎么没人回复?我觉得比上面楼的简洁哟...

下面的我也想到的...思路一样的...code
::计算某普通字符串中 t 的个数,字符串里面不能有敏感字符
@echo off
set str=This is a te,st,t t t t
set /a for=-1
for %%a in ("%str:t=" "%") do set /a for+=1
echo %for%
pause
[题目c] 老掉牙了...刚混混的时候被bat-zw来个测试,将一歌词本内容居中,里面都英文字符,如下

  Quote:
[Promise don't come easy]
I should have known all along.
There was something wrong.
I just never read between the lines.
Then I woke up one day and found you on your way.
Leaving nothing but my heart behind.
What can I do to make it up to you.
Promises don't come easy.
But tell me if there's a way to bring you back home to stay.
Well I'd promises anything to you.
I've been walkin' around with my head hanging down.
Wondrin' what I'm gonna do.
'Cause when you walked out that door.

保存为 lyric.txt

想了好久... 想到玩特效的时候用的一些把戏,用得上!
::只支持纯单字节字符的字符串。
@echo off &setlocal enabledelayedexpansion
for /l %%a in (1,1,80) do (set space= !space!)
for /f "tokens=* eol=" %%a in (lyric.txt) do (
set "an=%%a%space%"
set an=!an:~0,80!
set kong=!an:%%a=!
set kong=!kong:  = !
echo !kong!%%a
)
pause
思路分析下,假设 单行字符个数 在80以内,往后补80空格,再抓前80个,排去字符串,剩下后面空格,
(字符串与后补空格又区分开来)
将空格两个变成一个,然后移到字符串前面,就居中拉......(咔咔,联想到俺 中间变大变小+同步变色的方框.bat)

      通用的....感觉找vbs更适合

看看上面也才抓了3道题,感觉好空虚...

------以下是set截取字符串另解------仅供参考,感觉思路被混淆者请绕开-----

    关于截取字符,help的解释,我困惑了很久(现在还勉强理解),于是决定尝试--用另一种方式描述
set 截取变量所产生的结果. (把保留,剔除,正负数的结果区分开来)

(我很早就在群发过以下内容,如果在别的帖子见过,怀疑我,没关系,我是一个提倡者.)

====================以下以另一种方式描述,仅供参考====================
对于 %str:~n,m%

   ~代表省略
   后面的那个数字代表: 省略后,剩下的字符串被保留的个数。若值为负则需计算.

不管是省略还是保留,指的都是前面的字符:

-----规律------%a:~n,m% [省略前n个],[保留剩下的前m个]
-----规律------%a:~-n,-m% [省略前 总数-n 个] 剩下 n 个 [保留剩下的前 n-m 个]

这样说仍然是不易于想像的,以下给出例子:

- - - -例子:set a=123456789 共9个字符- - - - -  若出现-n的情况,则实际操作数 = 现有字符数-n

1.  echo,%a:~0,5%  (前面不省略) 保留前 5个
2.  echo,%a:~0,-5% (前面不省略) 保留前 4个 (9-5=4)
3.  echo,%a:~5%  省略前5个,剩下的保留
4.  echo,%a:~-5% 省略前 4 个,剩下的保留  (剩下后5个)
5.  echo,%a:~-3,2% 省略前 6 个(剩后3个:789) 剩下的再保留前2个
6.  echo,%a:~-5,-3% 省略前 4 个(剩后5个:56789) ,剩下的再保留前5-3=2个,  结果显示56
                                         [其实相当于 echo %a:~4,2% "-"的使用要看已知条件和要求]

7.  echo %a:~1,1% 这个不用说......
- - - - - - - - - - - - - - - - - - - - - - - -
    一般的说,为了避免混淆,习惯上会倾向于只使用某种形式,像我刚入门的时候尽量避免 - 号
先在则是常用了. 看上面 4. 的注释  因为省略前 总数-n 个,所以剩下的就是n个,是后面的n个.

    所以 ~-n 可以方便的理解为: 保留后面n个

    所以如果我要获得%time%的最后两个数字,就用%time:~-2%
而不是算一下%time%一共有几个符号,然后 %time:~9%
~-n 的优点体现在, 可以轻松获得 未知长度字符串的后n位字符.

在一些情况下适当的使用,就不用 计算字符串字符个数 啦。
------------------------------仅供参考-----------------------------

    这里基本用统一方式描述了不同处理结果.尽管个别例子可用更简单的方式描述,但统一一些更重要,
所以上面的例子统一用一种规则描述,思考起来不易混淆。

----------------------------
练习也是重要的,随便说几个吧

set str=未知字符串大概十几个字符

1.获取该未知字符串的后3个字符
2.一句echo实现--显示该未知字符串的后3个字符的前两个
3.一句echo实现--显示该未知字符串[省略前5个,省略后5个]的结果

    算了,手痒,第3道,echo,%str:~5,-5%
可以试用上面的计算法则分析

[ Last edited by 523066680 on 2009-1-14 at 09:58 ]

   此帖被 +13 点积分     点击查看详情   
评分人:【 HAT 分数: +8  时间:2009-1-10 15:51
评分人:【 tireless 分数: +5  时间:2009-1-10 21:34




综合型编程论坛

我的作品索引
  
2009-1-10 11:12
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 2 楼』:  

又翻了下精华帖,原来我错过了这么多好东西,顺便把标题链接贴上来....

-------------------------------------------------------------
    如何判断变量的长度??
原文链接为:http://www.cn-dos.net/forum/viewthread.php?tid=24745

---------------------------------------------------------------
    [求助]如何获得字符的字数和截取字符
原文链接为:http://www.cn-dos.net/forum/viewthread.php?tid=28571

---------------------------------------------------------------
   [精彩][批处理字符出现次数统计]
原文链接为:http://www.cn-dos.net/forum/viewthread.php?tid=25182

类似的一个
    如何统计某个字符串在文本中出现的次数?
原文链接为:http://www.cn-dos.net/forum/viewthread.php?tid=21250

---------------------------------------------------------------
又抓到一个帖子了,标题: 如何验证输入的字符串包含双字节字符
(精华帖2008 看到的,我单机用户,没抓到链接)

---------------------------------------------------------------
标题: [已解决]优化一下计算字符串长度的代码,谢谢!
---------------------------------------------------------------



综合型编程论坛

我的作品索引
  
2009-1-10 11:13
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
linee
初级用户





积分 94
发帖 49
注册 2008-12-14
状态 离线
『第 3 楼』:  

[问题a]的特殊解决可扩展到16个字符,^_^
@echo off
set str=exist
set n=%str%fedcba9876543210
set/a n=0x%n:~16,1%+1
echo,%str% 字符个数为 %n% 个
pause


   此帖被 +5 点积分      点击查看详情   
评分人:【 523066680 分数: +5  时间:2009-1-15 14:16


2009-1-10 14:58
查看资料  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 4 楼』:  

可惜我没分加了哦    我做过别的扩展,只是句子就变长了

因为不通用,有没有别的前辈的好 就没发,
@echo off
set str=cn-dos
set st2=Str%str%11111111111111111111111111111111111111111111111111111111111111111111111111111111
set "st2=%st2:~0,83%"
call set n=%%st2:Str%str%=-0%%
set /a n=80 %n:1=-1%
echo,%n%
pause
::个数可以是0 范围是0~80 的普通字符串。




综合型编程论坛

我的作品索引
  
2009-1-10 15:02
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 5 楼』:  

建议在帖子标题中增加一下利于搜索的关键字

   此帖被 +3 点积分     点击查看详情   
评分人:【 523066680 分数: +3  时间:2009-1-14 09:58




2009-1-10 15:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 6 楼』:  

虽然是偏方,不过还是发上来了 ,40个字符
@echo off
set str=abcde
set st2=%str%%str%4039383736353433323130292827262524232221201918171615141312111009080706050403020100
echo,%str% 共有 %st2:~80,2% 个字符
pause




综合型编程论坛

我的作品索引
  
2009-1-14 10:01
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: