无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 5533|回复: 61
打印 上一主题 下一主题

[求助] 命令如何查找有中文字符的行

  [复制链接]
1#
发表于 2022-5-19 09:18:41 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2022-5-19 12:26 编辑
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set file1=test.txt
  4. set "string1=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890~!@#$*()_+`-=,.?/;"'{}[]\^|^<^>^&%%^^^^ "
  5. for /f "delims=" %%c in ('type !file1!') do (
  6.     call :str_x "%%c"
  7.     if !found0! EQU 1 ECHO "%%c"  
  8. )

  9. pause
  10. goto :eof

  11. :str_x
  12.     set "str1=%~1"
  13.     SET found0=0
  14.     for /l %%i in (0,1,255) do (
  15.         set ch=!str1:~%%i,1!
  16.         if not "!ch!"=="" (
  17.             set found1=0
  18.             for /l %%n in (0,1,92) do (
  19.                 if "!ch!"=="!string1:~%%n,1!" set /a found1 +=1
  20.             )
  21.             if !found1! EQU 0 (
  22.                 set found0=1
  23.                 exit /b
  24.             )
  25.         ) else (exit /b)
  26.     )
  27. exit /b
复制代码



先做个字典包含 键盘常规字符,然后 ,读取文件每一行,逐行逐字符判断,如果该字符不在 字典中,就判定为 中文。假定 文件每行最多 256个字符。


点评

谢谢! 我用findstr 的下面的参数都很难实现查找有中文字符的行 [class] [^class] [x-y]  详情 回复 发表于 2022-5-19 09:25
回复

使用道具 举报

2#
发表于 2022-5-19 11:29:32 | 显示全部楼层
这个 ^ 太麻烦。
回复

使用道具 举报

3#
发表于 2022-5-21 10:08:58 | 显示全部楼层
还是要搞个 非中文的 字符集,做排除用。 比如英文的字符集

点评

也可试下非排除法,判断字符是否 >=啊  详情 回复 发表于 2022-5-21 20:45
我曾经就有个奇葩的想法,把GBK中的所有中文相关字符都弄到一个记事本中用来匹配。。。  详情 回复 发表于 2022-5-21 18:19
回复

使用道具 举报

4#
发表于 2022-5-21 22:05:02 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2022-5-21 22:26 编辑
szwp 发表于 2022-5-21 20:45
也可试下非排除法,判断字符是否 >=啊

这也是个思路

  1.     @echo off
  2.     setlocal ENABLEDELAYEDEXPANSION
  3.     set file1=test.txt
  4.     for /f "delims=" %%c in ('type !file1!') do (
  5.         call :str_x "%%c"
  6.         if !found0! EQU 1 ECHO [%%c]
  7.     )

  8.     pause
  9.     goto :eof

  10.     :str_x
  11.         set "str1=%~1"
  12.         SET found0=0
  13.         set n=0
  14.         :loop1
  15.         for %%i in (!n!) do (
  16.             set ch=!str1:~%%i,1!
  17.             if "!ch!"=="" exit /b
  18.             if not "!ch!"=="" (
  19.                 if "!ch!" GEQ "啊" ( if "!ch!" LEQ "齄" (
  20.                     set found0=1
  21.                     exit /b
  22.                 ))
  23.             )
  24.         )
  25.         set /a n +=1
  26.         goto loop1
  27.     exit /b
复制代码



点评

尽量少在for中使用call,遍历内容较少时没什么,多的时候很影响效率,你用for /l直接echo和call方式echo一试便知。  详情 回复 发表于 2022-5-22 09:55
当集合较大时,还是判断范围方便。这样可将16区前的全角符号制表符也排除了。  详情 回复 发表于 2022-5-22 09:46
回复

使用道具 举报

5#
发表于 2022-5-22 10:04:17 | 显示全部楼层
nttwqz 发表于 2022-5-22 09:55
尽量少在for中使用call,遍历内容较少时没什么,多的时候很影响效率,你用for /l直接echo和call方式echo ...

用call 主要用到 exit /b
如果 直接用 for ,就得用 goto

点评

那就用goto跳出for循环。 你觉得用了call貌似觉得提高了效率,很可能效率反而更低。实际使用中,谁也不可能每次都测试不同写法的执行效率,所以还是少用为好。而且,你这也没到了需要权衡利弊到底用不用call的时候  详情 回复 发表于 2022-5-22 11:50
回复

使用道具 举报

6#
发表于 2022-5-22 21:47:46 | 显示全部楼层
nttwqz 发表于 2022-5-22 11:50
那就用goto跳出for循环。
你觉得用了call貌似觉得提高了效率,很可能效率反而更低。实际使用中,谁也不 ...

确实如此,因为 call 本身就是一个耗时的指令,他相当于 变相调用 了一次 cmd 。
我用 call 并不是因为效率,只是  书写上的习惯,习惯 模块化 函数化 了。容易 模块化的 修改和 理解。

当然,对于这样单一目的的,确实没必要 搞一个函数来调用。

回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-6-2 12:04

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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