标题: [文本处理] [已解决]批处理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
思路:
- 去除最后一个:在字符串末尾做一个记号,用 for 取得最后一个字串,然后替换掉最后一个字串;
- 去除第一个:set str=%str:*_=%
- @echo off
- SetLocal EnableDelayedExpansion
- set "_Str=str_bb_cc_bb_cc_bb_cc_0010"
-
- for %%a in ("%_Str:_=" "%[/结尾]") do set _Str_End=_%%~a
- set "_Str_Middle=%_Str:*_=%[/结尾]"
- set _Str_Middle=!_Str_Middle:%_Str_End%=!
-
- echo %_Str_Middle%
- 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楼 的帖子
- set "_Str=str_bb_cc_bb_cc_bb_cc_0010"
-
- for %%a in ("!_Str:_=" "![/结尾]") do set _Str_End=_%%~a
- set "_Str_Middle=!_Str:*_=![/结尾]"
- for %%e in ("!_Str_End!") do set _Str_Middle=!_Str_Middle:%%~e=!
-
- echo !_Str_Middle!
- pause
复制代码
作者: bumboo 时间: 2010-8-10 17:49
啥都不说了,五体投地
作者: a6c123 时间: 2010-8-11 13:04
想到了一个更好的办法:
将 _ 替换为 .,%%~na 就把最后一个去掉了。- set "_Str=str_bb_cc_b.b_cc_bb_cc_0010"
-
- ;;;;;;;;; rem 如果字符串中不含英文句号“.”,可以把分号开头的行去掉
- ;;;;;;;;; set _Str=!_Str:.=[英文句号]!
-
- for /f "tokens=1,* delims=." %%a in ("!_Str:_=.!") do set _Str_Middle=%%~nb
- set _Str_Middle=!_Str_Middle:.=_!
-
- ;;;;;;;;; set _Str_Middle=!_Str_Middle:[英文句号]=.!
- echo !_Str_Middle!
- pause
复制代码
[ 本帖最后由 a6c123 于 2010-8-11 13:09 编辑 ]
作者: terse 时间: 2010-8-11 14:26
不兼容某些特殊字符- @echo off
- set "Str=str_bb_cc_b.b_cc_bb_cc_0010"
- for /f "tokens=1* delims=_" %%i in ("%str%") do set "str=%%j"&call :lp
- setlocal EnableDelayedExpansion
- echo !var:~1!
- pause&exit
- :lp
- for /f "tokens=1* delims=_" %%i in ("%str%") do (
- if "%%j" neq "" (
- set "str=%%j"&set "var=%var%_%%i"&goto lp
- )
- )
复制代码
作者: qq106942397 时间: 2010-8-16 21:14
结束了也发发代码:
- @echo off&setlocal enabledelayedexpansion
- Title 任意输入用"_"号分隔,不取开尾 →ψ疯行天魔Ф
- set T=str_bb_cc_0010
- set /p T=任意输入用"_"号分隔,不取开尾:
- set "T=!T:\=\!"
- set "T=!T:_=\!"
- for /f "tokens=* delims=" %%a in ('echo c:\%T%') do (
- for /f "tokens=1,2,* delims=\" %%b in ('echo %%~dpa') do (
- set "TT=%%d"
- set "TT=!TT:\=_!
- set "TT=!TT:\=\!
- echo !TT!))
-
- pause
- exit
复制代码
错误点是_号都当分隔号处理掉...
所以不能好好处理有_号的字符内容
[ 本帖最后由 qq106942397 于 2010-8-16 21:29 编辑 ]
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |