![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-08 19:08 |
共 47,811 主题排行 / 349,895 发帖 / 今日 0 篇 / 48,253 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 批处理支持正则表达式吗? |
| 可打印版本 1,298 / 14 |
| 第1楼 xipx | 发表于 2008-05-27 16:18 |
| 初级用户 发帖 25 积分 62 | |
|
批处理支持正则表达式吗? 我想在批处理用正则表达式来做替换工作,现实吗?
![]() |
|
| 第2楼 pooronce | 发表于 2008-05-27 16:34 |
| 中级用户 发帖 250 积分 484 | |
|
仅仅CMD自带的命令的话,不现实。目前所知,仅findstr能支持查找时的少数几个RE字符。
不过可以考虑移植一些win32下用的nix命令进来 比如sed gawk等 |
|
| 第3楼 HAT | 发表于 2008-05-27 16:48 |
| 版主 发帖 5,017 积分 9,023 | |
|
findstr /?
Regular expression quick reference: . Wildcard: any character * Repeat: zero or more occurances of previous character or class ^ Line position: beginning of line $ Line position: end of line [class] Character class: any one character in set [^class] Inverse class: any one character not in set [x-y] Range: any characters within the specified range \x Escape: literal use of metacharacter x \<xyz Word position: beginning of word xyz\> Word position: end of word For full information on FINDSTR regular expressions refer to the online Command Reference. |
|
| 第4楼 xipx | 发表于 2008-05-28 09:59 |
| 初级用户 发帖 25 积分 62 | |
Originally posted by pooronce at 2008-5-27 04:34 PM: 请问能通过findstr命令来替换文本吗? ![]() |
|
| 第5楼 HAT | 发表于 2008-05-28 10:05 |
| 版主 发帖 5,017 积分 9,023 | |
Originally posted by xipx at 2008-5-28 09:59 AM: 把你的具体要求写出来,自然有人贴代码。 |
|
| 第6楼 bat-zw | 发表于 2008-05-28 10:15 |
| 金牌会员 发帖 1,276 积分 3,105 | |
|
findstr语句是批处理中唯一的正则表达式,但用其进行替换必须要考虑效率的问题,如果可能的化尽量使用if语句来代替findstr语句。
|
|
| 第7楼 xipx | 发表于 2008-05-28 10:19 |
| 初级用户 发帖 25 积分 62 | |
Originally posted by HAT at 2008-5-28 10:05 AM: 譬如,替换所有的e-mail为空。 |
|
| 第8楼 bat-zw | 发表于 2008-05-28 10:24 |
| 金牌会员 发帖 1,276 积分 3,105 | |
|
set str=%str:e-mail=%
|
|
| 第9楼 xipx | 发表于 2008-05-28 10:27 |
| 初级用户 发帖 25 积分 62 | |
Originally posted by zw19750516 at 2008-5-28 10:24 AM: 是替换所有e-mail格式的字符串 例如: abc@163.com acro@hotmail.com war@74y.com |
|
| 第10楼 bat-zw | 发表于 2008-05-28 11:06 |
| 金牌会员 发帖 1,276 积分 3,105 | |
|
a.txt
替换的批处理: |
|
| 第11楼 pooronce | 发表于 2008-05-28 11:08 |
| 中级用户 发帖 250 积分 484 | |
|
不现实的,我曾经头疼过
因为findstr只能检索出RE所在的行,并不能确定RE在这行中的位置或者剥离出RE来 所以,要实现替换还是引入其它命令的好。 |
|
| 第12楼 bat-zw | 发表于 2008-05-28 12:20 |
| 金牌会员 发帖 1,276 积分 3,105 | |
|
再加难点: a.txt
批处理: ps:这个用findstr是根本做不到的。 [ Last edited by zw19750516 on 2008-5-28 at 12:26 PM ] |
|
| 第13楼 26933062 | 发表于 2008-05-28 13:06 |
| 银牌会员 发帖 879 积分 2,268 | |
|
不太同意12楼的说法,首先,findstr并不是如你所说的那样效率低下,
做个测试。 假设a.txt内容有一万行,而e-mail格式的行只有10行,现要求显示含e-mail格式的行。 你用for和findstr分别做个测试看看时间差,就知道findstr会比for要快多少倍了。 另外:你12楼代码并不严谨,假设a.txt内容含有以下几行(非正规e-mail格式),你的结果会有错误 @time 25.com @ @dg.com a@dg.com aaa@.com .com@age 而这个问题,用for配合findsgr正则,就很容易完成。 当然前提和你的一样,a.txt每行的内容只能含有一个@和.com字符窜。 : [ Last edited by 26933062 on 2008-5-28 at 01:14 PM ] |
|
| 第14楼 bat-zw | 发表于 2008-05-28 15:08 |
| 金牌会员 发帖 1,276 积分 3,105 | |
|
非正规e-mail格式???????????
findstr /in "..*@..*.com这种表达式还是第一次看到。 [ Last edited by zw19750516 on 2008-5-28 at 03:12 PM ] |
|
| 第15楼 pooronce | 发表于 2008-05-28 15:25 |
| 中级用户 发帖 250 积分 484 | |
Originally posted by 26933062 at 2008-5-28 01:06 PM: 算是一种解决方法吧 但主要的问题就是不严谨了,要实现严谨的话又非常困难 比如邮件用的ccTLD,除了.com之外还有很多,像.net,.cn,.org.com.cn等等 另外也提到了,一行中只能一个@和ccTLD也是不大现实的 findstr要严谨地查找到已经比较困难了,而那一行再用for来处理就更是麻烦得多了。 这也是findstr的一大弱点吧,希望在后面的win系统中能将findstr强化了。 |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |