无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
12
返回列表 发新帖
楼主: 2012xb21cn

[求助] 删除第N个某字符后面的所有字符

    [复制链接]
发表于 2018-6-28 18:13:50 | 显示全部楼层
chiannet 发表于 2018-6-28 16:00
这个并不太好,比如以下字符串

16F的通用性确实好很多!
  1. @echo off&setlocal enabledelayedexpansion
  2. set str=1245.5545.4784264-5455.65455
  3. :start
  4. set last=%str:~-1,1%
  5. set str=%str:~0,-1%
  6. IF "%last%"=="."  (goto end )
  7. goto start
  8. :end
  9. echo "%str%"
  10. pause>nul
复制代码

但突然发神经,想获取第一个.号前面的字符串呢?
脑阔大!!!
回复

使用道具 举报

发表于 2018-6-28 18:47:13 来自手机 | 显示全部楼层
本帖最后由 holley2008 于 2018-6-28 18:51 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. set str=1245.5545.4784264-5455.65455
  3. :start
  4. set first=%str:~0,1%
  5. set last=%str:~-1,1%
  6. set str=%str:~0,-1%
  7. set strf=%str:~1,-1%
  8. IF "%last%"=="." (goto end )
  9. IF "%first%"=="." (goto end )
  10. goto start
  11. :end
  12. echo "%str%"
  13. echo "%strf%"
  14. pause>nul
复制代码

应该可以。回家途中,回去再试试…
手机编辑巨麻烦

评分

参与人数 1无忧币 +5 收起 理由
freesoft00 + 5

查看全部评分

回复

使用道具 举报

发表于 2018-6-28 21:18:25 | 显示全部楼层
  1. @echo off
  2. set a=1245.5545.4784264-5455.65455
  3. set dp_tmp=X:\%a:.=\%

  4. call :DOTPATH %dp_tmp%
  5. echo %RET_PATH%
  6. pause
  7. goto :EOF

  8. :DOTPATH
  9. set RET_PATH=%~dp1
  10. set RET_PATH=%RET_PATH:\=.%
  11. set RET_PATH=%RET_PATH:~3,-1%
  12. goto :EOF
复制代码

评分

参与人数 1无忧币 +5 收起 理由
freesoft00 + 5

查看全部评分

回复

使用道具 举报

发表于 2018-6-28 21:24:35 | 显示全部楼层
  1. @echo off
  2. set a=1245.5545.4784264-5455.65455
  3. set a1=X:\%a:.=\%
  4. for /f %%i in ("%a1%") do set a1=%%~pi
  5. set a1=%a1:\=.%
  6. set a1=%a1:~1,-1%
  7. echo %a1%
  8. pause
复制代码

点评

如果原字符串中含有 \ 就会产生误解。  详情 回复 发表于 2018-6-28 22:14
回复

使用道具 举报

发表于 2018-6-28 22:10:00 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2018-6-28 22:19 编辑

从前往后 剔除第一个 . 前面的部分
两个方法,自己选。


  1. @echo off
  2. set "lx001=1245.5545.4784264-5455.65455"
  3. :loop
  4.         if "%lx001:~0,1%"=="" goto end
  5.         if "%lx001:~0,1%"=="." goto end
  6.         set lx001=%lx001:~1%
  7.         goto loop
  8. :end
  9. echo “%lx001:~1%”
  10. pause
复制代码


  1. @echo off
  2. for /f "tokens=1,* delims=." %%a in ("1245.5545.4784264-5455.65455") do (echo "%%b")
  3. pause
复制代码

点评

获取的是第一个.后面的字符串,,,我想要的是获取第一个.前面的字符串 用for比较简单 但想靠set分割 来做 有点抓瞎...  详情 回复 发表于 2018-6-29 07:06
回复

使用道具 举报

发表于 2018-6-28 22:14:51 | 显示全部楼层

如果原字符串中含有  \  就会产生误解。
回复

使用道具 举报

发表于 2018-6-29 07:06:17 | 显示全部楼层
dos时代菜鸟 发表于 2018-6-28 22:10
从前往后 剔除第一个 . 前面的部分
两个方法,自己选。

获取的是第一个.后面的字符串,,,我想要的是获取第一个.前面的字符串
用for比较简单
  1. for /f "tokens=1 delims=." %%a in ("%str%") do echo %%a
复制代码

但想靠set分割 来做  有点抓瞎...

点评

[attachimg]376087[/attachimg] [attachimg]376088[/attachimg]  详情 回复 发表于 2018-6-29 08:53
回复

使用道具 举报

发表于 2018-6-29 08:45:50 | 显示全部楼层
是在重新做OFFICE了吗?你可以把具体任务放上来,大家一起帮你调试。
回复

使用道具 举报

发表于 2018-6-29 08:53:37 | 显示全部楼层
本帖最后由 chiannet 于 2018-6-29 09:09 编辑
holley2008 发表于 2018-6-29 07:06
获取的是第一个.后面的字符串,,,我想要的是获取第一个.前面的字符串
用for比较简单


1.JPG

2.JPG

3.JPG






  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. SET A1=左&SET A2=右&SET B1=前&SET B2=后

  4. :N
  5. CLS
  6. ECHO.&ECHO.
  7. ECHO.&ECHO.
  8. SET /P FS=输入定位符号并回车:
  9. REM 定位符号,赋值给FS,本批处理只能处理长度为1的单字符。
  10. IF "%FS%"=="" (ECHO.&ECHO 输入无效,请重新输入!
  11. PAUSE >NUL && CLS && GOTO N) ELSE (SET FS=%FS:~0,1%)

  12. SET "TP=%~DP0"
  13. REM 原始.TXT所在路径名,赋值给TP,以“\”结尾。
  14. IF NOT EXIST "%TP%原始.TXT" (ECHO.&ECHO 未发现"%TP%原始.TXT"
  15. PAUSE >NUL && CLS && EXIT)

  16. :M
  17. CLS
  18. SET AX=&SET BX=
  19. ECHO.&ECHO.
  20. ECHO.&ECHO              按需求变换“原始.TXT”中每行字符串
  21. ECHO.&ECHO.
  22. ECHO.&ECHO        1、取得最%A1%“%FS%”之%B1%的字符
  23. ECHO.&ECHO        2、取得最%A1%“%FS%”之%B2%的字符
  24. ECHO.&ECHO        3、取得最%A2%“%FS%”之%B1%的字符
  25. ECHO.&ECHO        4、取得最%A2%“%FS%”之%B2%的字符
  26. ECHO.&ECHO        5、退出

  27. ECHO.&ECHO.
  28. SET /P AB=输入代码并回车:
  29. IF NOT "%AB%"=="" SET AB=%AB:~0,1%
  30. IF "%AB%"=="1" (SET AX=%A1%&SET BX=%B1%)
  31. IF "%AB%"=="2" (SET AX=%A1%&SET BX=%B2%)
  32. IF "%AB%"=="3" (SET AX=%A2%&SET BX=%B1%)
  33. IF "%AB%"=="4" (SET AX=%A2%&SET BX=%B2%)
  34. IF "%AB%"=="5" EXIT
  35. IF "%AX%"=="" (ECHO.&ECHO 输入无效,请重新输入!
  36. PAUSE >NUL && CLS && GOTO M)
  37. SET PT="%TP%最%AX%定位符之%BX%的字符.TXT"
  38. DEL %PT% /F >NUL 2>NUL
  39. FOR /F "DELIMS=" %%I IN ('TYPE "%TP%原始.TXT"')  DO  CALL :L "%%I"
  40. IF EXIST %PT% (CLS&ECHO.&ECHO %PT% 已创建。&ECHO.&ECHO.&PAUSE)
  41. GOTO M

  42. :L
  43. SET "B=%~1"
  44. IF "%AB%"=="1"  (IF "%B:~0,1%"=="%FS%" (SET "RE=有一个“%FS%”位于此行首位。"&GOTO E))
  45. IF "%AB%"=="4"  (IF "%B:~-1%"=="%FS%" (SET "RE=有一个“%FS%”位于此行末尾。"&GOTO E))
  46. SET RE=此行找不到指定的定位符号"%FS%"!
  47. SET /A N=1
  48. SET "A=%~1"

  49. :R
  50. SET /A NN=%N%-1

  51. IF "%AB%"=="4" (SET "B=!A:~-%N%!"
  52.         SET "D=!B:~0,1!"
  53.         IF "!D!"=="%FS%" (SET "RE=!A:~-%NN%!"&GOTO E)
  54.         IF "!B!"=="%A%" GOTO E)

  55. IF "%AB%"=="3"  (SET D=%B:~-1,1%
  56.         SET B=!B:~0,-1!
  57.         IF "!D!"=="%FS%"  (SET "RE=!B!"&GOTO E))

  58. IF "%AB%"=="2"  (SET D=%B:~0,1%
  59.         SET B=!B:~1,100000!
  60.         IF "!D!"=="%FS%"  (SET "RE=!B!"&GOTO E))

  61. IF "%AB%"=="1" (SET "B=!A:~0,%N%!"
  62.         SET "D=!B:~-1!"
  63.         IF "!D!"=="%FS%"  (SET "RE=!A:~0,%NN%!"&GOTO E)
  64.         IF "!B!"=="%A%" GOTO E)

  65. SET /A N=%N%+1
  66. IF %AB% GTR 1 (IF %AB% LSS 4 (IF "%B%"=="" GOTO E))
  67. GOTO R

  68. :E
  69. IF %AB% GTR 1 (IF %AB% LSS 4 (IF "%RE%"=="" SET "RE=有且仅有一个“%FS%”位于此行最%BX%位。"))
  70. ECHO %RE%>>%PT%
  71. GOTO :EOF




复制代码

点评

赞一个!我下下来好好研究一下,,,学学set的用法。  发表于 2018-6-29 09:12
回复

使用道具 举报

发表于 2018-6-29 09:02:18 | 显示全部楼层
闲得那个痛才搞这样的代码
回复

使用道具 举报

发表于 2018-6-29 09:29:11 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2018-6-29 10:54 编辑




一个 豆豆 的事情,搞得大家都  很 会逗了。哈哈哈
回复

使用道具 举报

发表于 2018-7-1 14:22:25 | 显示全部楼层
对于不定长,把分隔符转成空格,字符串作为函数参数,用 shift 依次处理

set A=1245.5545.4784264-5455.65455
set A=%A:.= %
call :f %A%
goto :end

:f
do

shift 1
loop

goto :eof

回复

使用道具 举报

发表于 2022-9-1 11:43:29 | 显示全部楼层
本帖最后由 likeyouli 于 2022-9-1 11:47 编辑

老帖子,很有意义,也顶下,
顺便说下我的答案,假如1245.5545.4784264-5455.65455在excel中是A1单元格,
提取最后一个.前面的所有字符串:  =LEFT(A1,FIND("louzhuhaoren",SUBSTITUTE(A1,".","louzhuhaoren",LEN(A1)-LEN(SUBSTITUTE(A1,".",""))))-1)   无论有多少个.  无论长度多少均可以,但没有.时会报错
回复

使用道具 举报

发表于 2022-9-1 14:38:13 | 显示全部楼层
本帖最后由 likeyouli 于 2022-9-4 16:33 编辑

接上个帖子,改进下,没有这个符号 . 时,提示“没有这个符号”
=IF(ISERROR(LEFT(A1,FIND("louzhuhaoren",SUBSTITUTE(A1,".","louzhuhaoren",LEN(A1)-LEN(SUBSTITUTE(A1,".",""))))-1)),"没有这个符号",LEFT(A1,FIND("louzhuhaoren",SUBSTITUTE(A1,".","louzhuhaoren",LEN(A1)-LEN(SUBSTITUTE(A1,".",""))))-1))
回复

使用道具 举报

发表于 2023-1-8 11:51:12 | 显示全部楼层
用正则表达式最方便,首尾匹配,
最后一个不是.  而是其他符号甚至空格都可以:\D\d+$
这样获取的是最后一个符号及后边的数字,如果需要前边的内容,将这替换为空即可

正则表达式测试工具.exe

333 KB, 下载次数: 0, 下载积分: 无忧币 -2

回复

使用道具 举报

发表于 2023-1-14 14:26:09 | 显示全部楼层
看了这个帖子里牛人的解答,我觉得我的水平还不够,多学习学习啊
回复

使用道具 举报

发表于 2023-1-14 15:33:45 | 显示全部楼层
感谢大神分享!!!
回复

使用道具 举报

发表于 2023-1-14 17:58:30 | 显示全部楼层
不错 学习到不少
回复

使用道具 举报

发表于 2024-2-25 09:02:59 | 显示全部楼层
技术贴!
收藏了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-3-29 23:59

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表