Board logo

标题: [文本处理] [已解决]批处理delims截取字符串 [打印本页]

作者: bumboo    时间: 2010-8-10 13:43     标题: [已解决]批处理delims截取字符串

类似于这样的字符串str_bb_cc_0010
我要得到的结果是bb_cc
问题是我不知道到底有多少个分隔符_
也就是我要得到第一个分隔符和最后一个分隔符之间的内容。

希望大家不吝赐教,不要用goto,因为外层有一个不能缺少的for循环

[ 本帖最后由 bumboo 于 2010-8-10 17:49 编辑 ]
作者: broly    时间: 2010-8-10 13:50

@for /f "tokens=2,3 delims=_" %%i in ("str_bb_cc_0010") do @echo %%i_%%j
@pause
作者: bumboo    时间: 2010-8-10 14:16

不是这样的,不确定中间_的数量,比如可能是str_aa_bb_0020,也可能是str_aa_2293
也就是说
str_aa_bb_2210        得到 aa_bb
str_aa_2293               得到 aa
str_a_n_a_0098        得到 a_n_a

不用goto实现
作者: bumboo    时间: 2010-8-10 14:53

看的人很多啊,不可能没人会吧?会的帮帮忙吧,多谢多谢
作者: a6c123    时间: 2010-8-10 15:15

思路:
  1. @echo off
  2. SetLocal EnableDelayedExpansion
  3. set "_Str=str_bb_cc_bb_cc_bb_cc_0010"
  4. for %%a in ("%_Str:_=" "%[/结尾]") do set _Str_End=_%%~a
  5. set "_Str_Middle=%_Str:*_=%[/结尾]"
  6. set _Str_Middle=!_Str_Middle:%_Str_End%=!
  7. echo %_Str_Middle%
  8. pause
复制代码
说明:


[ 本帖最后由 a6c123 于 2010-8-10 15:38 编辑 ]
作者: bumboo    时间: 2010-8-10 15:26

多谢指教,不过结果输出不正确啊。结尾没有去掉。

根据你的思路在调试,还是多谢了。
作者: terse    时间: 2010-8-10 15:37

提示  tokens=1*
作者: a6c123    时间: 2010-8-10 15:40     标题: 回复 6楼 的帖子

确实错了一个地方。请再试试 5楼 代码。
作者: bumboo    时间: 2010-8-10 15:42

多谢 a6c123 ,问题解决。
现在有了新的问题,因为我本身已经开启了变量延迟,也就是出现了!!嵌套的现象。这样无法得到正确的结果,何解?

[ 本帖最后由 bumboo 于 2010-8-10 17:35 编辑 ]
作者: a6c123    时间: 2010-8-10 17:44     标题: 回复 9楼 的帖子

  1. set "_Str=str_bb_cc_bb_cc_bb_cc_0010"
  2. for %%a in ("!_Str:_=" "![/结尾]") do set _Str_End=_%%~a
  3. set "_Str_Middle=!_Str:*_=![/结尾]"
  4. for %%e in ("!_Str_End!") do set _Str_Middle=!_Str_Middle:%%~e=!
  5. echo !_Str_Middle!
  6. pause
复制代码

作者: bumboo    时间: 2010-8-10 17:49

啥都不说了,五体投地
作者: a6c123    时间: 2010-8-11 13:04

想到了一个更好的办法:

    将 _ 替换为 .,%%~na 就把最后一个去掉了。
  1. set "_Str=str_bb_cc_b.b_cc_bb_cc_0010"
  2. ;;;;;;;;; rem 如果字符串中不含英文句号“.”,可以把分号开头的行去掉
  3. ;;;;;;;;; set _Str=!_Str:.=[英文句号]!
  4. for /f "tokens=1,* delims=." %%a in ("!_Str:_=.!") do set _Str_Middle=%%~nb
  5. set _Str_Middle=!_Str_Middle:.=_!
  6. ;;;;;;;;; set _Str_Middle=!_Str_Middle:[英文句号]=.!
  7. echo !_Str_Middle!
  8. pause
复制代码

[ 本帖最后由 a6c123 于 2010-8-11 13:09 编辑 ]
作者: terse    时间: 2010-8-11 14:26

不兼容某些特殊字符
  1. @echo off
  2. set "Str=str_bb_cc_b.b_cc_bb_cc_0010"
  3. for /f "tokens=1* delims=_" %%i in ("%str%") do set "str=%%j"&call :lp
  4. setlocal EnableDelayedExpansion
  5. echo !var:~1!
  6. pause&exit
  7. :lp
  8. for /f "tokens=1* delims=_" %%i in ("%str%") do (
  9.    if "%%j" neq "" (
  10.       set "str=%%j"&set "var=%var%_%%i"&goto lp
  11.    )
  12. )
复制代码

作者: qq106942397    时间: 2010-8-16 21:14

结束了也发发代码:
  1. @echo off&setlocal enabledelayedexpansion
  2. Title 任意输入用"_"号分隔,不取开尾 →ψ疯行天魔Ф
  3. set T=str_bb_cc_0010
  4. set /p T=任意输入用"_"号分隔,不取开尾:
  5. set "T=!T:\=\!"
  6. set "T=!T:_=\!"
  7. for /f "tokens=* delims=" %%a in ('echo c:\%T%') do (
  8. for /f "tokens=1,2,* delims=\" %%b in ('echo %%~dpa') do (
  9. set "TT=%%d"
  10. set "TT=!TT:\=_!
  11. set "TT=!TT:\=\!
  12. echo !TT!))
  13. pause
  14. exit
复制代码

错误点是_号都当分隔号处理掉...
所以不能好好处理有_号的字符内容

[ 本帖最后由 qq106942397 于 2010-8-16 21:29 编辑 ]




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