Board logo

标题: [文本处理] [已解决]批处理如何将简单字符串中的汉字和字母分开 [打印本页]

作者: hlzj88    时间: 2017-1-19 16:48     标题: [已解决]批处理如何将简单字符串中的汉字和字母分开

本帖最后由 hlzj88 于 2017-1-20 22:33 编辑

本提问也可称为从变量里删除延迟变量
假设 我得到文件夹名称  格式 汉字zimu
  1. setlocal enabledelayedexpansion
  2. for /d %%i in (*) do (
  3. set hz=%%i
  4.     for /f %%j in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set hz=!hz:%%j=!
  5.    set zm=?????(删除%%i中已有的汉字不会)
  6. )
复制代码
至此,我能得到汉字,但怎么从%%i中得到字母串,代码多次调整,无法得到字母串

也许有其他更好的方法,我主要是想看到以上代码如何写能完成删除延迟变量的
作者: pcl_test    时间: 2017-1-19 20:26

本帖最后由 pcl_test 于 2017-5-28 16:54 编辑

逐字判断
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set #%%a=1
  3. set "str=汉字zimu"
  4. for /l %%a in (0 1 6) do (
  5.     rem if not defined为提取汉字
  6.     for /f %%b in ("!str:~%%a,1!") do if defined #%%b echo;%%b
  7. )
  8. pause
复制代码

作者: hlzj88    时间: 2017-1-19 20:40

回复 2# pcl_test
请教,未交待的条件,字符串长度不限。如我的代码例,已经可以得到汉字串,能否通过bat直接从字符串里去掉已得的汉字串,而留下字母串。
作者: Nsqs    时间: 2017-1-19 20:55

本帖最后由 Nsqs 于 2017-1-19 21:46 编辑

方法1
  1. @echo off&setlocal enabledelayedexpansion
  2. set "s=abcdefghijkmlnopqrstuvwxyz"
  3. for /l %%1 in (0 1 26)do call set #%%s:~%%1,1%%=#
  4. set /p str=输入汉字或字母:
  5. for /f "tokens=1 delims=:" %%1 in ('^(echo %str%^&echo.^)^|findstr /o "^.*$"')do set /a len=%%1-4
  6. for /l %%1 in (0 1 %len%)do (
  7. for /f %%2 in ("!str:~%%1,1!") do (
  8. if not defined #%%2 (call set s1=%%s1%%%%2)else call set s2=%%s2%%%%2
  9. )
  10. )
  11. echo 汉字部分:%s1%
  12. echo 字母部分:%s2%
  13. pause
复制代码
方法2
  1. ' 2>nul &@echo off&cls&set /p str=输入汉字或字母: & call echo %%str%%|cscript -nologo -e:"vbs" "%~0"&pause&exit
  2. set regexp=new regexp
  3. set ws=wsh.stdin
  4. with regexp
  5. read=ws.readline
  6. .global=-1:.ignorecase=-1
  7. .pattern="[^\u4e00-\u9fff0]*"
  8. wsh.echo "汉字部分:" & .replace(read,empty)
  9. .pattern="[^a-z]*"
  10. wsh.echo "字母部分:" & .replace(read,empty)
  11. end with
复制代码

作者: hlzj88    时间: 2017-1-19 21:11

回复 4# Nsqs
方法1 测试 汉字里会出现字母  比如 我我你你他他wwnntt
作者: Nsqs    时间: 2017-1-19 21:33

回复 5# hlzj88


    稍作修改
作者: 523066680    时间: 2017-1-19 21:46

\p{han}, in perl
作者: pcl_test    时间: 2017-1-19 22:00

回复 3# hlzj88

论坛搜索 字符串长度,学学怎么计算/获取长度
将得到汉字从原字符串中逐一去除掉,剩下的就是字母,跟你去除字母得到汉字一样
作者: Batcher    时间: 2017-1-19 23:09

回复 3# hlzj88


能否通过bat直接从字符串里去掉已得的汉字串

不能直接
作者: zz100001    时间: 2017-1-20 14:31

批处理是一个很现实的东西
看你代码的意思只是想要把 [当前目录] 中 所有[文件夹] 的名字 [去掉汉字]
可以直接粗暴的弄嘛
  1. echo off
  2. setlocal enabledelayedexpansion
  3. chcp 437>nul
  4. dir /b /ad>%~s0:0s~%
  5. chcp 936>nul
  6. for /f "delims=" %%a in (%~s0:0s~%) do (
  7.   set wjm=%%a
  8.   set zm=!wjm:?=!
  9.   echo !zm!
  10. )
  11. pause
复制代码

作者: hlzj88    时间: 2017-1-20 22:31

谢谢楼上的各位,523066680版主的代码于我来说如天书。
作者: xyh9999    时间: 2021-11-25 15:16

本帖最后由 xyh9999 于 2021-11-25 15:20 编辑
  1. @echo off & setlocal enabledelayedexpansion
  2. for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set #%%a=1
  3. set str=汉字ziMu
  4. for /l %%a in (0 1 5) do (
  5. set b=!str:~%%a,1!
  6. ::not defined为提取汉字,defined为提取英文
  7. if not defined #!b! set s=!s!!b!
  8. )
  9. echo !s!
  10. pause
复制代码

作者: xyh9999    时间: 2021-11-25 15:19

本帖最后由 xyh9999 于 2021-11-25 15:21 编辑

回复 4# Nsqs

修改成如下好象也行:
  1. @echo off & setlocal enabledelayedexpansion
  2. set s=abcdefghijkmlnopqrstuvwxyz
  3. for /l %%1 in (0 1 26)do call set #%%s:~%%1,1%%=0
  4. ::set /p str=输入汉字或字母:
  5. set str=汉字ziMu123abc
  6. echo.字符串是: !str!
  7. for /f "tokens=1 delims=:" %%1 in ('^(echo !str!^& echo.^)^|findstr /o .')do (set /a len=%%1-4)
  8. echo.字符串长度是: %len%+1
  9. for /l %%1 in (0 1 %len%)do (
  10.     for /f %%2 in ("!str:~%%1,1!") do (
  11.         if not defined #%%2 (set s1=!s1!%%2)else (set s2=!s2!%%2)
  12.     )
  13. )
  14. echo 非字母部分:!s1!
  15. echo 字母部分:!s2!
  16. pause
复制代码

作者: xyh9999    时间: 2021-11-25 15:24

也可如下:
  1. @echo off & setlocal enabledelayedexpansion
  2. set hz=汉字ziMu
  3. set hz1=!hz!
  4. set hz2=!hz!
  5. for %%j in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (set hz1=!hz1:%%j=!)
  6. echo 非字母是:!hz1!
  7. for %%j in (!hz1!) do (set hz2=!hz2:%%j=!)
  8. echo 字母是:!hz2!
  9. pause
复制代码

作者: qixiaobin0715    时间: 2021-11-25 15:35

这样呢:
hanzi汉字ziMu字母
结果:
hanziziMu




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2