Board logo

标题: 也出一题,娱乐娱乐:以子串为分隔符现实字符串的内容 [打印本页]

作者: 26933062     时间: 2008-5-12 00:43    标题: 也出一题,娱乐娱乐:以子串为分隔符现实字符串的内容

set "Str=bat1 ,1bbat;22     t2bat;3 ,3   3bat444babat"
要求以字符串bat为分割符,显示变量str的内容
变量str中bat的位置和数量都不确定。
如上面显示的结果是
1 ,1b
;22     t2
;3 ,3   3
444ba

前提:不允许把bat替换成某一单一字符后再用for截取。

───────────────── 版务记录 ─────────────────
执行:HAT
操作:[2008-11-09]在帖子标题中增加搜索关键字
说明:原标题"也出一题,娱乐娱乐。"不利于论坛搜索
───────────────── 版务记录 ─────────────────


[ Last edited by HAT on 2008-11-9 at 02:49 ]
作者: slore     时间: 2008-5-12 01:12
似乎有个帖子……
作者: pusofalse     时间: 2008-5-12 01:15
把 bat  删除也不行吗?~
作者: bat-zw     时间: 2008-5-12 01:17

@echo off
set "Str=bat1 ,1bbat;22     t2bat;3 ,3   3bat444babat"
:begin
set /a n+=1
for /f "tokens=%n% delims=bat" %%i in ("%str%") do echo %%i&goto begin
pause>nul

作者: 26933062     时间: 2008-5-12 01:25
4 楼 zw19750516 兄弟,显示结果漏掉了不少字符啊。。
2楼  意在娱乐,动动脑筋,有没有过这个帖无所谓吧。
3楼  删除可以,只要达到效果。
作者: HAT     时间: 2008-5-12 01:30


  Quote:
Originally posted by zw19750516 at 2008-5-12 01:17 AM:
[code]
@echo off
set "Str=bat1 ,1bbat;22     t2bat;3 ,3   3bat444babat"
:begin
set /a n+=1
for /f "tokens=%n% delims=bat" %%i in ("%str%") do echo %%i&goto be ...

楼主发帖的意图就是为了告诉大家在for里面是不能直接用多个字符做分隔符的吧^_^
作者: bat-zw     时间: 2008-5-12 01:34
有这个嫌疑,呵呵,不能把bat替换成单一字符,等于卡死了答题人的脖子。
本来是多么容易的事啊:
@echo off
set "str=bat1 ,1bbat;22     t2bat;3 ,3   3bat444babat"
set str=%str:bat=#%
:begin
set /a n+=1
for /f "tokens=%n% delims=#" %%i in ("%str%") do echo %%i&goto begin
pause>nul
[ Last edited by zw19750516 on 2008-5-12 at 01:38 AM ]
作者: terse     时间: 2008-5-12 01:35
替换 #=bat  不允许吗
作者: 26933062     时间: 2008-5-12 01:36


  Quote:
Originally posted by HAT at 2008-5-12 01:30:

楼主发帖的意图就是为了告诉大家在for里面是不能直接用多个字符做分隔符的吧^_^

这个相信大家都知道,只是想考考大家的思路,喜欢动脑筋的就动动脑筋,认为无聊的就全当是个水帖吧。。^_^。。
作者: 26933062     时间: 2008-5-12 01:37


  Quote:
Originally posted by zw19750516 at 2008-5-12 01:34:
有这个嫌疑,呵呵,不能把bat替换成单一字符,等于卡死了答题人的脖子。

并非没有答案。。。。。
作者: HAT     时间: 2008-5-12 01:55
我的思路是先获取bat在str中的位置(这一步已经完成),然后依次截取就行了(思考中),不知是否和 26933062 兄的想法一样。
作者: terse     时间: 2008-5-12 01:56
@echo off&setlocal enabledelayedexpansion
set "var=bat1 ,1bbat;22     t2bat;3 ,3   3bat444babat"
set var=%var: =#%
set var=%var:;=`%
set var=%var:bat= %
call:lp "%var%"
pause
goto :eof
:lp
for /f "tokens=1* delims= " %%i in (%1) do (
        set var=%%i
        set var=!var:#= !
        set var=!var:`=;!
        echo !var!
        call :lp "%%j"
        )

[ Last edited by terse on 2008-5-12 at 01:58 AM ]
作者: slore     时间: 2008-5-12 02:02


  Quote:
Originally posted by terse at 2008-5-12 01:56:
@echo off&setlocal enabledelayedexpansion
set "var=bat1 ,1bbat;22     t2bat;3 ,3   3bat444babat"
set var=%var: =#%
set var=%var:;=`%
set var=%var:bat= %
call:lp "%var%" ...

pause 应该放在:lp上面……而不是下面

而且还是违规替换了bat……
作者: 26933062     时间: 2008-5-12 02:09
呵呵, terse 疯狂大替换,缺点是如果变量本身含有#号,则显示结果少字符。
并且将bat替换为空格,再用for以空格为分割符截取,属违规。。。
作者: bat-zw     时间: 2008-5-12 02:13    标题: 我再来:


@echo off&setlocal enabledelayedexpansion
set "str=bat1 ,1bbat;22     t2bat;3 ,3   3bat444babat"
:lp
if "%str:~,3%"=="bat" (
   set /a n+=1
   if !n! gtr 1 echo.!var!&set var=
   set str=%str:~3%
   ) else (
   set a=%str:~,1%&set var=!var!!a!
   set str=%str:~1%
)
if defined str goto lp
pause>nul
[ Last edited by zw19750516 on 2008-5-12 at 02:22 AM ]
作者: 26933062     时间: 2008-5-12 02:14
没注意 11 楼 HAT 兄的回帖,抱歉。。。
我的思路与你不一样,兴许你的代码更高效简洁,期待你的结果。。。
作者: 26933062     时间: 2008-5-12 02:20    标题: 回复 15 楼



  Quote:
Originally posted by zw19750516 at 2008-5-12 02:13:
[code]
@echo off&setlocal enabledelayedexpansion
set "str=bat1 ,1bbat;22     t2bat;3 ,3   3bat444babat"
:lp
if "%str:~,3%"=="bat" (
   echo.!var!&set var= ...

不错,但还有个bug 若str结尾不是bat时,会丢失最后的字符。

[ Last edited by 26933062 on 2008-5-12 at 02:23 AM ]
作者: bat-zw     时间: 2008-5-12 02:28


  Quote:
Originally posted by 26933062 at 2008-5-12 02:20:

不错,但还有个bug 若str结尾不是bat时,会丢失最后的字符。

[ Last edited by 26933062 on 2008-5-12 at 02:23 AM ]

再改:
@echo off&setlocal enabledelayedexpansion
set "str=1ba2bat1 ,1bbat;22     t2bat;3 ,3   3bat444babat9999"&set n=0
:lp
if "%str:~,3%"=="bat" (
   set /a n+=1
   set str=%str:~3%
   ) else (
   set a=%str:~,1%&set var!n!=!var%n%!!a!
   set str=%str:~1%
)
if defined str goto lp
for /l %%i in (0,1,!n!) do echo.!var%%i!
pause>nul
[ Last edited by zw19750516 on 2008-5-12 at 02:31 AM ]
作者: bat-zw     时间: 2008-5-12 02:32
刚才粘错了,再测试看
作者: 26933062     时间: 2008-5-12 02:42    标题: 18 楼

不错不错,提两个建议:
set a=%str:~,1%&set var!n!=!var%n%!!a!
可改为 set var!n!=!var%n%!%str:~,1%

加一个判断,可避免连续batbat时显示的空行。
for /l %%i in (0,1,!n!) do if defined var%%i echo.!var%%i!
作者: HAT     时间: 2008-5-12 02:45
zw19750516 兄的方法比我的要简洁,学习了,我的还是放弃算了。
作者: bat-zw     时间: 2008-5-12 02:46
20楼
高见,兄弟考虑问题比我全面啊。
作者: terse     时间: 2008-5-12 12:31
其实开始我想的就是逐字判断  后来看可以删 我就用替换了  呵呵  考试老不及格哦  补上一个 算练习吧
@echo off&setlocal enabledelayedexpansion
set "str=bats afi/ ouy#ewbattnvbib atcghbat ret,yre;wih9  %bat"
:lp
if not "!str:~,3!"=="bat" (set var=!var!!str:~,1!) else (
      if not "!var!"=="" echo !var!&set var=
      set str=!str:~2!
      )
      set str=!str:~1!
      if defined str goto lp
      if not "!var!"=="" echo !var!
pause

作者: 26933062     时间: 2008-5-12 13:42
贴一个我的,效率应该比逐字判断要快点吧?
@echo off
set "Str=bat1 ,1bbatbatbat;22     t2bat;3 ,3   3batbat444babat"
:loop
   set "num=%str:*bat=%"
   call set "var=a%%str:bat%num%=%%a"
   if not "%var%"=="aa" echo.%var:~1,-1%
   set "str=%num%"
   if "%str%"=="%var:~1,-1%" set "num="
   if defined num goto loop
pause

作者: FQ     时间: 2008-5-12 13:55
为何不能用替换呢?其实替换是很简单的啊
@echo off&setlocal
set "str=bat1 ,1bbat;22     t2bat;3 ,3   3bat444babat999999999"
for %%a in ("%str:bat=" "%") do echo/%%~a

作者: clian76     时间: 2008-5-12 16:49
高手啊!!