[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理delims截取字符串

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

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

[ 本帖最后由 bumboo 于 2010-8-10 17:49 编辑 ]

结束了也发发代码:
  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 编辑 ]

TOP

不兼容某些特殊字符
  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. )
复制代码

TOP

想到了一个更好的办法:

    将 _ 替换为 .,%%~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 编辑 ]

TOP

啥都不说了,五体投地

TOP

回复 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
复制代码

TOP

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

[ 本帖最后由 bumboo 于 2010-8-10 17:35 编辑 ]

TOP

回复 6楼 的帖子

确实错了一个地方。请再试试 5楼 代码。

TOP

提示  tokens=1*

TOP

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

根据你的思路在调试,还是多谢了。

TOP

思路:

  • 去除最后一个:在字符串末尾做一个记号,用 for 取得最后一个字串,然后替换掉最后一个字串;
  • 去除第一个:set str=%str:*_=%
  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 编辑 ]

TOP

看的人很多啊,不可能没人会吧?会的帮帮忙吧,多谢多谢

TOP

不是这样的,不确定中间_的数量,比如可能是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实现

TOP

@for /f "tokens=2,3 delims=_" %%i in ("str_bb_cc_0010") do @echo %%i_%%j
@pause
---学无止境---

TOP

返回列表