标题: [文本处理] 批处理怎样获取某字符串在另一字符串中出现的位置 [打印本页]
作者: 胡子轩 时间: 2007-12-26 11:06 标题: 批处理怎样获取某字符串在另一字符串中出现的位置
我想得到"某字符串在另一字符串中出现的位置",该怎么办啊,有没有人能写个好代码啊
如:求 "a" 在 "abaca1" 出现的位置,分别是"1 3 5"
感谢各位的好代码!!
[ 本帖最后由 胡子轩 于 2007-12-27 21:37 编辑 ]
作者: youxi01 时间: 2007-12-26 11:23
呵呵,你的要求似乎是字符串,而不是单个字符哦
难度要高很多
作者: foxJL 时间: 2007-12-26 14:21
原帖由 胡子轩 于 2007-12-26 11:06 发表
如:求 "a" 在 "abaca1" 出现的位置,分别是"1 5"
不理解你的意思,能不能再说清楚一点.
我理解成了三种意思:
1.找出a所在的位置,而出现的位置应该是"1 3 5".这样应该不是你想要的.
2.找出第1个a和最后一个a.
3.找出字符串所在的位置,如:要找出"ve"在"I love you too."中的位置?这样结果则是 "5 6".
不知是哪一种.
作者: 胡子轩 时间: 2007-12-26 15:51
原帖由 foxJL 于 2007-12-26 14:21 发表
不理解你的意思,能不能再说清楚一点.
我理解成了两种意思:
1.找出a所在的位置,而出现的位置应该是"1 3 5".这样应该不是你想要的.
2.找出第1个a和最后一个a.
3.找出字符串所在的位置,如:要找出"ve"在"I love yo ...
对,对,对 就是3
作者: novaa 时间: 2007-12-26 17:10
呵呵我来个可以查询整个文本的。
可以找出出现在文本的哪行且在该行的位置。
太多变量了。有点乱。呵呵。欢迎测试!
-
- @echo off&setlocal enabledelayedexpansion
- set /p sStrQ=请输入你想查的字符串:
- set iNum=0
- set "StrQ=!sStrQ!*"
- call :GetNum
- set Line=0
- for /f "delims=" %%i in ('findstr /n .* 1.txt') do (
- set /a Line=!Line!+1
- set sStrL=%%i
- set sStrL1=!sStrL:%sStrQ%=!
- if not "!sStrL1!"=="!sStrL!" (
- set sStrLp=!sStrL:%sStrQ%=#!
- set iPnum=1
- call :GetPosition
- call :Echo
- )
- )
- :GetNum
- set sStr=!StrQ:~0,1!
- set StrQ=!StrQ:~1!
- if not "!sStr!"=="*" (set /a iNum=!iNum!+1) else (goto :eof)
- goto :GetNum
- :GetPosition
- set sStrLp1=!sStrLp:~0,1!
- set sStrLp=!sStrLp:~1!
- if not "!sStrLp1!"=="#" (set /a iPnum=!iPnum!+1) else (goto :eof)
- goto :GetPosition
- :Echo
- echo 此字符串出现在第!Line!行第!iPnum!位置.
- echo\&echo\
- set EndL=iPnum!+!iNum!
- echo 此字符串结束在!EndL!位置
- echo\&echo\
- echo 任意键继续
- pause>nul
- goto :eof
-
-
-
复制代码
作者: ieutk 时间: 2007-12-26 17:29
- @echo off
- setlocal enabledelayedexpansion
- set "test=1234568as7df55safd28ieutksadfadfkdeisuASksdf"
- set num=0
-
- :main
- set input=
- set /p input= 请输入要查找的字符或字符串:
- if not defined input goto main
- call :ie
- pause&goto :eof
-
- :ie
- for /l %%a in (0,1,200) do (
- if "!test:~%%a,1!"=="" (
- set /a num+=1
- if "!input:~%num%,1!"=="" (
- goto :eof
- ) else (
- goto ie
- )
- )
- if "!input:~%num%,1!"=="!test:~%%a,1!" (
- set /a _num=%%a+1
- call echo 字符"!input:~%num%,1!"在%%_num%%位置
- set _num=
- )
- )
- echo.
- goto :eof
复制代码
不清楚这样行不行?
[ 本帖最后由 ieutk 于 2007-12-26 17:34 编辑 ]
作者: 随风 时间: 2007-12-26 20:50
是这个意识么?
:- @echo off&setlocal enabledelayedexpansion
- set var=fsafsfafafsdfaf
- echo %var%
- for /l %%i in (1 1 100) do (
- if defined var (
- if /i "!var:~0,1!"=="a" set wei=!wei! %%i
- set var=!var:~1!
- ))
- echo\&echo a出现的位置是 %wei%
- pause>nul
复制代码
作者: youxi01 时间: 2007-12-26 21:07 标题: 回复 7# 的帖子
呵呵,你的这个似乎只针对单个的字符哦
但是人家可能是字符串的啊
作者: 随风 时间: 2007-12-26 21:58
原帖由 ieutk 于 2007-12-26 17:29 发表
@echo off
setlocal enabledelayedexpansion
set "test=1234568as7df55safd28ieutksadfadfkdeisuASksdf"
set num=0
:main
set input=
set /p input= 请输入要查找的字符或字符串:
if not defined input g ...
非常不错,不过提点建议.
既然是查找字符串,那么比如查找 28 是否就应该忽略对 单个2和8的查找呢?
作者: ieutk 时间: 2007-12-26 22:40
既然是查找字符串,那么比如查找 28 是否就应该忽略对 单个2和8的查找呢?
多谢提点.是呀,这是个问题,呵呵,没办法,技术有限呀,只能做到这样!
作者: youxi01 时间: 2007-12-26 23:15 标题: 回复 5# 的帖子
代码过于复杂
观察你的代码,似乎先要取得 查找字符的长度等信息,其实还有很多好办法的
既然学会在这里做标记,那就在这里继续动脑筋:set "StrQ=!sStrQ!*",可以大大压缩代码的
还有个建议:用来做标记的文件,作好挑不常见的那种,这个*还不太好,因为用户也经常用到
作者: 随风 时间: 2007-12-26 23:22
查找字符串或单个字符都可以.
:- @echo off&setlocal enabledelayedexpansion
- set var=123abc567abcldfkjgjfjdabcadooooslkfjafjaaboocdsjfabc7111222k
- echo 请输入要查找的字符串,如: abc
- set /p sur=
- if /i "!sur!"=="a" (set var=!var!b) else set var=!var!a
- set cscs=0
- cls
- call :sss sur ci
- call :sss var zong
- :lis
- call set str=%%var:*!sur!=%%
- call set str2=%%var:!sur!=%%
- if "!var!"=="!str2!" goto ok
- set /a cscs+=1
- call :sss str wei
- set /a max=zong-wei,q=max-ci+1
- set wz=!wz! !q!-!max!位
- set var=!str!&set y=y
- goto lis
- :sss
- set %2=0
- for /l %%i in (0 1 200) do (
- if not "!%1:~%%i,1!"=="" set /a %2+=1
- )
- goto :eof
- :ok
- echo 字符串 !sur! 共出现 !cscs! 次
- if not defined y goto end
- echo\&echo 分别位于
- echo\&echo !wz!
- :end
- pause>nul
复制代码
[ 本帖最后由 随风 于 2007-12-26 23:33 编辑 ]
作者: novaa 时间: 2007-12-27 09:00
原帖由 youxi01 于 2007-12-26 23:15 发表
代码过于复杂
观察你的代码,似乎先要取得 查找字符的长度等信息,其实还有很多好办法的
既然学会在这里做标记,那就在这里继续动脑筋:set "StrQ=!sStrQ!*",可以大大压缩代码的
还有个建议:用来做标记的文件 ...
是不是set "StrQ=_!sStrQ!_" 然后可以怎么简洁?
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |