Board logo

标题: [文本处理] 批处理怎样获取某字符串在另一字符串中出现的位置 [打印本页]

作者: 胡子轩    时间: 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

呵呵我来个可以查询整个文本的。
可以找出出现在文本的哪行且在该行的位置。
太多变量了。有点乱。呵呵。欢迎测试!
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p sStrQ=请输入你想查的字符串:
  3. set iNum=0
  4. set "StrQ=!sStrQ!*"
  5. call :GetNum
  6. set Line=0
  7. for /f "delims=" %%i in ('findstr /n .* 1.txt') do (
  8. set /a Line=!Line!+1
  9. set sStrL=%%i
  10. set sStrL1=!sStrL:%sStrQ%=!
  11. if not "!sStrL1!"=="!sStrL!" (
  12. set sStrLp=!sStrL:%sStrQ%=#!
  13. set iPnum=1
  14. call :GetPosition
  15. call :Echo
  16. )
  17. )
  18. :GetNum
  19. set sStr=!StrQ:~0,1!
  20. set StrQ=!StrQ:~1!
  21. if not "!sStr!"=="*" (set /a iNum=!iNum!+1) else (goto :eof)
  22. goto :GetNum
  23. :GetPosition
  24. set sStrLp1=!sStrLp:~0,1!
  25. set sStrLp=!sStrLp:~1!
  26. if not "!sStrLp1!"=="#" (set /a iPnum=!iPnum!+1) else (goto :eof)
  27. goto :GetPosition
  28. :Echo
  29. echo 此字符串出现在第!Line!行第!iPnum!位置.
  30. echo\&echo\
  31. set EndL=iPnum!+!iNum!
  32. echo 此字符串结束在!EndL!位置
  33. echo\&echo\
  34. echo 任意键继续
  35. pause>nul
  36. goto :eof
复制代码

作者: ieutk    时间: 2007-12-26 17:29

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "test=1234568as7df55safd28ieutksadfadfkdeisuASksdf"
  4. set num=0
  5. :main
  6. set input=
  7. set /p input=  请输入要查找的字符或字符串:
  8. if not defined input goto main
  9. call :ie
  10. pause&goto :eof
  11. :ie
  12. for /l %%a in (0,1,200) do (
  13.         if "!test:~%%a,1!"=="" (
  14.                 set /a num+=1
  15.                 if "!input:~%num%,1!"=="" (
  16.                         goto :eof
  17.                     ) else (
  18.                         goto ie
  19.                     )
  20.             )
  21.         if "!input:~%num%,1!"=="!test:~%%a,1!" (
  22.                 set /a _num=%%a+1
  23.                 call echo  字符"!input:~%num%,1!"在%%_num%%位置
  24.                 set _num=
  25.             )
  26.     )
  27. echo.
  28. goto :eof
复制代码
不清楚这样行不行?

[ 本帖最后由 ieutk 于 2007-12-26 17:34 编辑 ]
作者: 随风    时间: 2007-12-26 20:50

是这个意识么?
:
  1. @echo off&setlocal enabledelayedexpansion
  2. set var=fsafsfafafsdfaf
  3. echo %var%
  4. for /l %%i in (1 1 100) do (
  5.   if defined var (
  6.      if /i "!var:~0,1!"=="a" set wei=!wei! %%i
  7. set var=!var:~1!
  8. ))
  9. echo\&echo a出现的位置是 %wei%
  10. 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

查找字符串或单个字符都可以.

:
  1. @echo off&setlocal enabledelayedexpansion
  2. set var=123abc567abcldfkjgjfjdabcadooooslkfjafjaaboocdsjfabc7111222k
  3. echo  请输入要查找的字符串,如: abc
  4. set /p sur=
  5. if /i "!sur!"=="a" (set var=!var!b) else set var=!var!a
  6. set cscs=0
  7. cls
  8. call :sss sur ci
  9. call :sss var zong
  10. :lis
  11.   call set str=%%var:*!sur!=%%
  12.   call set str2=%%var:!sur!=%%
  13.   if "!var!"=="!str2!" goto ok
  14.   set /a cscs+=1
  15.   call :sss str wei
  16.   set /a max=zong-wei,q=max-ci+1
  17.   set wz=!wz! !q!-!max!位
  18.   set var=!str!&set y=y
  19. goto lis
  20. :sss
  21.   set %2=0
  22.   for /l %%i in (0 1 200) do (
  23.      if not "!%1:~%%i,1!"=="" set /a %2+=1
  24.   )
  25. goto :eof
  26. :ok
  27.   echo  字符串 !sur! 共出现 !cscs! 次
  28.   if not defined y goto end
  29.   echo\&echo  分别位于
  30.   echo\&echo !wz!
  31. :end
  32. 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