Board logo

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

作者: xp3000    时间: 2016-3-29 16:18     标题: 求助bat+JScript通过正则表达式批量替换或提取字符串的方法

本帖最后由 pcl_test 于 2016-3-29 20:51 编辑

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

本帖最后由 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. )
复制代码

作者: xp3000    时间: 2016-3-29 19:41

少了个正则表达式提取功能,麻烦添加上,也是多条,
比如:
(?<=\s)[一-龥]{1,}(?=\s)
(([一-龥])?([一-龥])?([一-龥])?([一-龥])?[一-龥][一-龥])\1
原文件1.TXT提取新文件名为:提取1.TXT
原文件2.TXT提取新文件名为:提取2.TXT
作者: CrLf    时间: 2016-3-29 19:50

回复 3# xp3000


    已修改在原帖
作者: xp3000    时间: 2016-3-29 20:54

回复 4# CrLf


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

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

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

([一-龥])?匹配任意中文0或1次
整个正则表达式
(中文有或无,中文有或无,中文有或无,中文有或无,中文中文)\1作为分组重复一次,后面有两个中文必须匹配,
比如会匹配提取
高兴高兴、高高兴兴,非常高兴非常高兴、高高兴兴高高兴兴、非常好非常好、等等字符
作者: xp3000    时间: 2016-3-29 21:00

这个第三方工具不错,我下载的是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个空格,目的是将:
第一章朝气蓬勃

第一章        朝气蓬勃
替换为
第一章 朝气蓬勃
作者: CrLf    时间: 2016-3-29 21:00

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. )
复制代码

作者: xp3000    时间: 2016-3-29 21:12

本帖最后由 xp3000 于 2016-3-29 21:19 编辑

回复 7# CrLf


    对,不过grep这个支持的语法太少了,谁是作者添加下新功能啊
上面有个试了有个语法不能支持,刚刚试了下,又有个不能支持,应该是四种类型的环视不能支持
^(?=abc).*(?<=abc)$
作者: CrLf    时间: 2016-3-29 21:29

回复 8# xp3000


    js 不支持逆向预查,grep 的话,可以用 -P 选项开启
作者: CrLf    时间: 2016-3-29 21:46

回复 8# xp3000


    Array 的 grep 方法来自历史悠久的 Prototype.js 库
作者: WHY    时间: 2016-3-29 21:48

PowerShell 倒是支持逆向预查,但PowerShell 在处理文本方面不给力
作者: xp3000    时间: 2016-3-29 21:54

那些还真不会弄,除非拿现成的,然后查资料看例子,然后弄很久才会明白,还有上面的没网就处理不了




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