找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 28522|回复: 11

[文本处理] 求助bat+JScript通过正则表达式批量替换或提取字符串的方法

[复制链接]
发表于 2016-3-29 16:18:41 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2016-3-29 20:51 编辑

大量TXT,JScript正则表达式比较灵活,并且支持匹配中文,这个方便多了
需要一个例子,先用两条正则表达式替换字符串,这个直接替换,可能有UTF-8或ANSI编码
再用多条正则表达式提取字符串,提取的字符串内容,在原TXT文件名前面加“提取”两个字

评分

参与人数 1PB -4 收起 理由
pcl_test -4 未按版规发帖

查看全部评分

发表于 2016-3-29 18:17:47 | 显示全部楼层
本帖最后由 CrLf 于 2016-3-29 19:51 编辑

举个栗子,将目录下所有 txt 文件的 123 替换为 456,并将 abc 替换为 def,最后以原来的编码保存到提取文件:
  1. @echo off
  2. more +4 "%0" | mshta http://bathome.net/s/hta/ "eval(WSH.StdIn.ReadAll())"
  3. pause & exit /b

  4. dir().files().grep(/\.txt$/i)._each(
  5.         function(file){
  6.                 bin=iconv.load(file)
  7.                 bom=iconv.checkBom(bin)
  8.                 if(bom=='undefined')bom=iconv.toStr(bin,'gb2312')?'gb2312':'utf-8'
  9.                 str=iconv.toStr(bin,bom)
  10.                 str=str
  11.                         .replace(/123/g,'345')
  12.                         .replace(/abc/g,'def')
  13.                 iconv.saveText(str,'提取'+file,bom)
  14.         }
  15. )
复制代码

评分

参与人数 1技术 +1 收起 理由
xp3000 + 1 乐于助人

查看全部评分

 楼主| 发表于 2016-3-29 19:41:43 | 显示全部楼层
少了个正则表达式提取功能,麻烦添加上,也是多条,
比如:
(?<=\s)[一-龥]{1,}(?=\s)
(([一-龥])?([一-龥])?([一-龥])?([一-龥])?[一-龥][一-龥])\1
原文件1.TXT提取新文件名为:提取1.TXT
原文件2.TXT提取新文件名为:提取2.TXT
发表于 2016-3-29 19:50:46 | 显示全部楼层
回复 3# xp3000


    已修改在原帖
 楼主| 发表于 2016-3-29 20:54:22 | 显示全部楼层
回复 4# CrLf


   
帮忙再修改下,可能理解错误,是先进行两次正则表达式替换字符串,然后文本达到了理想效果,再进行另外的两条正则表达式提取,替换的正则表达式和提取的正则表达式不一样,
比如:
123替换的是345
abc替换的是def

但是提取的内容是
行首以abc开头,以abc结尾,中间任意字符的内容
^(?=abc).*(?<=abc)$

查找重复词,分组再重复一次
(([一-龥])?([一-龥])?([一-龥])?([一-龥])?[一-龥][一-龥])\1

([一-龥])?匹配任意中文0或1次
整个正则表达式
(中文有或无,中文有或无,中文有或无,中文有或无,中文中文)\1作为分组重复一次,后面有两个中文必须匹配,
比如会匹配提取
高兴高兴、高高兴兴,非常高兴非常高兴、高高兴兴高高兴兴、非常好非常好、等等字符
 楼主| 发表于 2016-3-29 21:00:33 | 显示全部楼层
这个第三方工具不错,我下载的是grep 2.22 单文件回车换行版,可惜发现有些语法不支持

(?<=[\r\n]+第[0-9一二两三四五六七八九十○零百千]{1,9}[章节])(\s?)+(?=\S)
替换一个空格,这个不能支持,

(?<=[\r\n]+第[0-9一二两三四五六七八九十○零百千]{1,9}[章节])
左侧文本能够匹配回车换行第xx章或节,但不计算为分组,
(\s?)0个或1个空格,匹配为分组1,
(\s?)+   这个匹配0个或多个空格
(?=\S)右侧文本能够匹配非空格字符串,但是不计算为分组

在这里替换值为1个空格,目的是将:
第一章朝气蓬勃

第一章        朝气蓬勃
替换为
第一章 朝气蓬勃
发表于 2016-3-29 21:00:43 | 显示全部楼层
Like this?
  1. @echo off
  2. more +4 "%0" | mshta http://bathome.net/s/hta/ "eval(WSH.StdIn.ReadAll())"
  3. pause & exit /b

  4. dir().files().grep(/\.txt$/i)._each(
  5.         function(file){
  6.                 bin=iconv.load(file)
  7.                 bom=iconv.checkBom(bin)
  8.                 if(bom=='undefined')bom=iconv.toStr(bin,'gb2312')?'gb2312':'utf-8'

  9.                 str=iconv.toStr(bin,bom)
  10.                 str=str
  11.                         .replace(/123/g,'345')
  12.                         .replace(/abc/g,'def')
  13.                 iconv.saveText(str,file,bom) //保存到源文件

  14.                 match1=str.match(/^(?=abc).*(?<=abc)$/mg)
  15.                 match2=str.match(/(([一-龥])?([一-龥])?([一-龥])?([一-龥])?[一-龥][一-龥])\1/g)
  16.                 match1=match1?match1:[]
  17.                 match2=match2?match2:[]
  18.                 arr = [].concat(match1,match2)
  19.                 iconv.saveText(arr.join('\r\n'),'提取'+file,bom) //保存到提取文件
  20.         }
  21. )
复制代码

评分

参与人数 1技术 +1 收起 理由
xp3000 + 1 乐于助人

查看全部评分

 楼主| 发表于 2016-3-29 21:12:30 | 显示全部楼层
本帖最后由 xp3000 于 2016-3-29 21:19 编辑

回复 7# CrLf


    对,不过grep这个支持的语法太少了,谁是作者添加下新功能啊
上面有个试了有个语法不能支持,刚刚试了下,又有个不能支持,应该是四种类型的环视不能支持
^(?=abc).*(?<=abc)$
发表于 2016-3-29 21:29:50 | 显示全部楼层
回复 8# xp3000


    js 不支持逆向预查,grep 的话,可以用 -P 选项开启
发表于 2016-3-29 21:46:40 | 显示全部楼层
回复 8# xp3000


    Array 的 grep 方法来自历史悠久的 Prototype.js 库
发表于 2016-3-29 21:48:19 | 显示全部楼层
PowerShell 倒是支持逆向预查,但PowerShell 在处理文本方面不给力
 楼主| 发表于 2016-3-29 21:54:17 | 显示全部楼层
那些还真不会弄,除非拿现成的,然后查资料看例子,然后弄很久才会明白,还有上面的没网就处理不了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 03:04 , Processed in 0.024090 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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