标题: [文本处理] 求助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,最后以原来的编码保存到提取文件:- @echo off
- more +4 "%0" | mshta http://bathome.net/s/hta/ "eval(WSH.StdIn.ReadAll())"
- pause & exit /b
-
- dir().files().grep(/\.txt$/i)._each(
- function(file){
- bin=iconv.load(file)
- bom=iconv.checkBom(bin)
- if(bom=='undefined')bom=iconv.toStr(bin,'gb2312')?'gb2312':'utf-8'
- str=iconv.toStr(bin,bom)
- str=str
- .replace(/123/g,'345')
- .replace(/abc/g,'def')
- iconv.saveText(str,'提取'+file,bom)
- }
- )
复制代码
作者: 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?- @echo off
- more +4 "%0" | mshta http://bathome.net/s/hta/ "eval(WSH.StdIn.ReadAll())"
- pause & exit /b
-
- dir().files().grep(/\.txt$/i)._each(
- function(file){
- bin=iconv.load(file)
- bom=iconv.checkBom(bin)
- if(bom=='undefined')bom=iconv.toStr(bin,'gb2312')?'gb2312':'utf-8'
-
- str=iconv.toStr(bin,bom)
- str=str
- .replace(/123/g,'345')
- .replace(/abc/g,'def')
- iconv.saveText(str,file,bom) //保存到源文件
-
- match1=str.match(/^(?=abc).*(?<=abc)$/mg)
- match2=str.match(/(([一-龥])?([一-龥])?([一-龥])?([一-龥])?[一-龥][一-龥])\1/g)
- match1=match1?match1:[]
- match2=match2?match2:[]
- arr = [].concat(match1,match2)
- iconv.saveText(arr.join('\r\n'),'提取'+file,bom) //保存到提取文件
- }
- )
复制代码
作者: 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://www.bathome.net/) |
Powered by Discuz! 7.2 |