[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

LookLike 过滤/获取相似内容

本帖最后由 CrLf 于 2015-8-14 16:29 编辑

实际上是 jscript.net,用 jsc.exe 编译的,需要 .net 2.0 支持

源代码在此,可以直接以 jscript 脚本运行:

2014/06/20 修正了一个非常规数组赋值导致的排序异常问题,并用条件编译语句改写成既能编译又能作为 js 脚本运行的两栖源代码,作为脚本运行时效率会比 exe 低很多
2014/12/06 修正了两处异常,并添加 /Blank /Only /To 开关
---------------------------------------------------------------------------
jscript原形的基础上增加了许多开关
原理见搜索引擎技术:标题去重 如何快速判断两个字符串的相似度

帮助信息:
  1. Usage: LookLike.exe
  2. [/All] [/Uniq] [/Include] [/Length=Number]
  3. [/Format[=(chs|en|num|RegExp)]] /To=String
  4. [/Rate=Number] [/Series=Number]
  5. [/Get] [/Only] [/Blank] [/Verbose]
  6. [/Key=String] [[drive:][path]filename]
  7. [/Help] [/Debug]
  8.   All 不将输入的内容分行,将用整个文件进行比较
  9.   Uniq 开启后将排除每行内容里重复的分段
  10. 若分段长度为 4,则 1111211111.... 等价于 11112111
  11.   Include 过滤被包含项
  12.   Length=Number
  13. 将内容划分成指定长度的分段,Number 为大于 0 的正整数,默认为 4
  14.   Format[=(def|chs|en|num|RegExp)]
  15. 在判断前先将文件根据自定义的选项处理一遍,可选子参数含义为:
  16. def-基础规则   chs-简体中文   en-英文和数字   num-仅数字
  17. RegExp-捕获或替换一个正则表达式对应的内容
  18. 格式为 /pattern/mode,如指定了 /To 开关,则为替换
  19.   Rate[=Number]
  20. 自定义筛选阀值必须大于 0 小等于 1,若不设置 Number 则动态计算
  21.   Series[=Number]
  22. 过滤连续匹配次数超过阀值的内容,若不设置 Number 则动态计算
  23.   Get 将排除改为获取
  24.   Only 对相似行保留一行
  25.   Blank 不处理预处理后的为空的行
  26.   Verbose 显示详细信息,格式为:来源|行号|长度|原始字符串
  27.   Key=String 根据给定的字符串进行筛选,支持以 %var% 的格式解析变量
  28.   [drive:][path]filename
  29. 指定输入文件,如未指定则从管道或重定向输入获取内容
  30.   Help 显示帮助信息
  31.   Debug 用错误输出句柄显示调试信息
  32.   注:   一、如未用 Rate 和 Series 指定阀值,默认将动态计算,行越短则越严格:
  33. Rate = Math.sin(2/(Math.sqrt(length+5)))
  34. Series = 1/Math.sqrt(length+1)
  35.   二、在开关中,
  36. 1、前缀可用 / 或 -,如 /Help 等价于 -Help
  37. 2、开关名不分大小写且可简写为首字母,如 /Get 等价于 /get 和 /G
  38. 3、= 与 : 等价,如 /Length=4 等价于 /Length:4
  39. 4、开关如重复出现,只以最后一个为准
复制代码
示例代码:
  1. dir | LookLike
  2. ::从 dir 输出中获取不相似的行
  3. LookLike /get /include <输入.txt
  4. ::从 输入.txt 中获取相似的行和完全被其他行包含的行
  5. LookLike /get /verbose 输入1.txt 输入2.txt
  6. ::从 输入1.txt 和 输入2.txt 获取相似的行,并打印详细信息
  7. set "变量=一下"
  8. LookLike /format:chs /key=测试%%变量%% 输入.txt
  9. ::为简体中文进行预格式化,将中文标点、英文字符、数字等内容预先处理为空格
  10. ::然后以 "测试一下" 为关键词在 输入.txt 中搜索相似的行
  11. set "字符串=bbs.bathome.net"
  12. for %%a in (*.txt) do LookLike /k:%字符串% /f /g /u /i /s "%%a" >nul||echo 在 "%%a" 中找到和 %字符串% 的内容
  13. ::以 bbs.bathome.ne 为关键词,判断在 *.txt 中是否有相似的行
  14. ::自行发挥。。。。。。
复制代码
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

回复 19# CrLf


赞一个,我想了好久都没想出来。


其实那个while不用覆盖的,思路也好呀。都搁这儿多好。

TOP

回复 18# 回家路上


    又想了一下,发现之前想错了,其实也很简单,已修改

TOP

回复 17# CrLf


哦,允许用双引号将分割符转义的意思。好的。我也想想。

TOP

回复 15# 回家路上


    哦,例子切错地方了,原来那样确实是两截,已修改。我是想说明分割参数得兼容双引号内含有空格的情况

TOP

本帖最后由 CrLf 于 2015-8-26 20:49 编辑

回复 15# 回家路上


    那应该只回一个参数才对
再改一下,还是可以用正则搞定的:
  1. getopts('1"   "2"   "3"   "4"   "5"   "6    a"   "b"   "c"   "d')
  2. function getopts(strArg){
  3.         var re = /[^"\s,;=]*"([^"]*("[^"\s,;=]*")*)*("[^"\s,;=]*|$)|[^"\s,;=]+/g
  4.         var argv = []
  5.         strArg.replace(re,function($0){argv.push($0.replace(/^"(.*)"$/g,'$1'))})
  6.         return argv
  7. }
复制代码
1

评分人数

TOP

回复 14# CrLf


getopts('"断" 断"续"续') 这样的是应该返回【断】【断】【续】【续】四个字符串吗?
我以为这种的是要返回【断】【断"续"续】这两个字符串呢。(⊙﹏⊙)b

TOP

本帖最后由 CrLf 于 2015-8-26 16:30 编辑

回复 13# 回家路上


    你好像没考虑到 getopts('断" "断"续"续') 的情况...不过突然发现我的正则也有点不对
(例子有误,已修改)

TOP

本帖最后由 回家路上 于 2015-8-26 12:29 编辑

回复 11# CrLf


昨天学到了正则表达式。然后回头又去理解了你的mshta宿主方式混编的解析参数的正则(O(∩_∩)O~以前根本看不懂)
  1. var argv = getopts(mshta.commandLine)
  2. for(var i=0;i<argv.length;i++)alert(argv[i])
  3. function getopts(strArg){
  4.         var re = /([^"\s,;=]*"[^"]*(?:"[^"\s,;=]*")*[^"]*(?:"[^"\s,;=]*|$))|[^"\s,;=]+/g
  5.         var argv = []
  6.         strArg.replace(re,function($0,$1){argv.push($1?$1.replace(/^"(.*)"$/,'$1'):$0)})
  7.         return argv
  8. }
复制代码
然后我也试写了一个正则表达式
  1. (".+?"(?=[\s,;=]|$))|[^\s,;=]+
复制代码
用你的那个方法测了测。好使哈。分享一下。
  1. <!-- :
  2. @echo off
  3. mshta "%~0" 11111   111111,1111111;   1111"1"1"11=1111"11"111 "1111111111" "11"1"1"1111"" "1111,1111"
  4. pause
  5. -->
  6. <HTA:APPLICATION id=mshta></HTA>
  7. <script>
  8. var argv = getopts(mshta.commandLine);
  9. alert(argv.join("\r\n"));
  10. close();
  11. function getopts(strArg){
  12.         var re = /(".+?"(?=[\s,;=]|$))|[^\s,;=]+/g;
  13.         var argv = [];
  14.         strArg.replace(re,function($0,$1){argv.push($1?$1.replace(/^"(.*)"$/,'$1'):$0)});
  15.         return argv;
  16. }
  17. </script>
复制代码

TOP

回复 11# CrLf


我这有一个问题,可以的话抽空解决一下,谢谢。O(∩_∩)O!
http://www.bathome.net/viewthread.php?tid=37044&extra=

TOP

回复 10# 回家路上


    w3school 有入门教程,基础语法是一样的
    入门后,查查脚本技术手册就熟了

TOP

回复 9# CrLf


请问,想学这个JScript的话你有没有好的文档啊。我看你的JScript学的特好。O(∩_∩)O!

TOP

回复 8# 回家路上


    条件编译语句

TOP

请问,js中的
  1. @if (@_jscript_version<6)
  2. var i
  3. @else
  4. var i:int
  5. @end
复制代码
这些@符号是干什么的呀。

TOP

回复 6# PowerShell


    你的逻辑,我实在搞不懂,不想解释什么,如果兄台在网内网外都是这副德性,想必过得不咋地吧?

TOP

返回列表