社会工作研究生:【正则表达式专题】正则表达式的应用

来源:百度文库 编辑:中财网 时间:2024/05/04 19:25:35
http://hi.baidu.com/hzworld/blog/item/ba8717d5dde06dc550da4b67.html【正则表达式专题】正则表达式的应用 2007-05-20 14:53 正则表达式(regular expression)可以用来查找,替换,提取符合一定模式的子串.
它的概念其实很简单,很多人望而生畏很大一部分原因在于记不住它的语法。其实如果利用英文来助记,就简单多了。(如 \t (tab) \n (new line) \w (word) )

1. 正则表达式的语法论坛已有不少介绍,这里就不详叙了(请参考下面链接),只选几个常用的:

. 匹配任意一个字符
[abxy0-6] 匹配abxy中任意一个字母或0-6任意一个数字
[^abxy0-6] 匹配除了abxy和0-6的任意一个字符
\t tab, 匹配tab
\n new line
\r return

\w word, 匹配任意一个字母(加上"_")
\W 匹配任意一个非字母
\s space, 匹配空格
\S 匹配非空格
\d digital,匹配任意一个数字
\D 匹配任意一个非数字

{n,m} 匹配n到m次
? 匹配0或1次,相当于 {0,1}
* 匹配0或多次,相当于 {0,}
+ 匹配1或多次,相当于 {1,}

^ 匹配行首
$ 匹配行尾
\b boundary,匹配单词边界

| or
( ) 括号分组,用于后向引用
\1 \2 后向引用先前括号分组的表达式


正则表达式详叙,请参考:

【正则表达式专题】正则表达式介绍及其在EmEditor的应用(更新) (nb590 )
[url]http://bbs.et8.net/bbs/showthread.php?t=652159[/url]

【原创+整理】EditPlus 2.12使用技巧集萃 build2005.03.14 (Liangjh )
[url]http://bbs.et8.net/bbs/showthread.php?t=623472[/url]

【帮助翻译】正则表达式简要用法-强大的查找替换语法 (Liangjh )
[url]http://bbs.et8.net/bbs/showthread.php?t=568178[/url]

【原创+整理】EditPlus 软件使用技巧以及常见问题解决(2004-08-23 完善) (Liangjh )
[url]http://bbs.et8.net/bbs/showthread.php?t=567662[/url]

【原创】Total Commander的正则表达式 (slownet )
[url]http://bbs.et8.net/bbs/showthread.php?t=599222[/url]

[url]http://www.regular-expressions.info/tutorial.html[/url]

[url]http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/jscript7/html/jsreconintroductiontoregularexpressions.asp[/url]





2. 正则表达式工具

工欲善其事,必先利其器。支持正则表达式的工具很多,这里介绍几个常用的。

2.1 正则表达式学习:
Regbuddy [url]www.regexbuddy.com[/url]
[img]http://www.regexbuddy.com/screens/regexbuddytiny.png[/img]

Regex Coach [url]www.weitz.de/regex-coach/[/url]
[img]http://www.weitz.de/regex-coach/shot.gif[/img]


【版主至诚奉献】正则表达式效验器(CCF Only) (dust2k )
[url]http://bbs.et8.net/bbs/showthread.php?t=441719[/url]


2.2 正则表达式批量文件更名,查找
【原创】Total Commander的正则表达式 (slownet )
[url]http://bbs.et8.net/bbs/showthread.php?t=599222[/url]

托把更名器 (xtools renamer)

search and replace

powergrep (regex buddy同一公司 [url]http://www.powergrep.com[/url] )
[img]http://www.powergrep.com/screens/powergrep320.png[/img]


2.3 支持正则表达式的编辑器

EmEditor
【正则表达式专题】正则表达式介绍及其在EmEditor的应用(更新) (nb590 )
[url]http://bbs.et8.net/bbs/showthread.php?t=652159[/url]

Editplus
【原创+整理】EditPlus 2.12使用技巧集萃 build2005.03.14 (Liangjh )
[url]http://bbs.et8.net/bbs/showthread.php?t=623472[/url]

UltraEdit

PSPad [url]http://www.pspad.com/[/url] (freeware)
Crimson Editor [url]http://www.crimsoneditor.com/[/url] (freeware)

textpro [url]http://www.fodian.net/[/url]


3. 正则表达式应用实例

要想真正掌握正则表达式语法并活学活用,实例是最好的教材。
结合应用实例理解正则表达式语法和不同情况下的模式解析,匹配组合,相信大家都能
再实际应用中体会到正则表达式的强大。

以下实例可以有不同解答,这里只是随便选了其中一种。顺便说一句,正则表达式很有用,但并不是万金油,有时其它方法更简单有效,如命令行。


3.1 请问EmEditor里面如何将回车替换为“,”?
[url]http://bbs.et8.net/bbs/showthread.php?t=640875[/url]
请问EmEditor里面如何将回车替换为“,”?在Word里面我就知道这么替换,可想在EMmEditor里面处理

选正则表达式
\r\n 替换为 ,



3.2 能用查找/替换解决吗?如何做?
[url]http://bbs.et8.net/bbs/showthread.php?t=617648[/url]
如图所示文档,很长,能否用查找/替换功能将红圈所示处的回车符去掉,两行变成一行以缩短文档?
[img]http://bbs.et8.net/bbs/attachment.php?attachmentid=288164&stc=1[/img]
用TEXTPRO查找“(\a+)”,替换为“\1\d”,勾上正则表达式。
能说一下这个软件的支持中文的正则表达式是如何支持么,例如,正则表达式可以区分字符和数字,也能区分出来中文字符么,gb、big5之类的可以自动判断么。
可以呀:\a匹配字母;\d就匹配数字;\c匹配汉字;\b就匹配BIG;\g就匹配GB。。。你自己去看帮助文件呀。



3.3 如何找出 6 个字母组成的单词?
[url]http://bbs.et8.net/bbs/showthread.php?t=650868[/url]
有没有什么工具,可以自动列出6 个字母组成的单词? 或 7 个。概念就我想找由几个字母长度的单词。英文的

search for: \b[a-zA-Z]{6}\b (谢谢crackabc兄指出)






3.4 怎样把一行文本替换成两行
[url]http://bbs.et8.net/bbs/showthread.php?t=354127[/url]
比如一段程序中一行是
123
现在我想变成
456
789
什么软件能实现,ue行吗


ue可以。
replace对话框里选中regular expressions,replace with 456^p789

editplus:
查找:123\n
替换为456\n789



3.5 editPlus如何把一段html中指定一段代码删掉
[url]http://bbs.et8.net/bbs/showthread.php?t=625548[/url]
比如我想把开始往后,到下一个结束的一段删掉,中间的内容不是一样的,有可能中间是一段html代码,有可能只有一些字符。
正则表达式该如何写?

editplut支持的是RegEx的子集,所以:
...同一行: ^
...不同行: ^

以上不完美:一旦搜到了这样的标签时,就下不去了。二没用问号,如果有ABC,会把B处也删了的。可以为.*?\n*?
(谢谢crackabc兄指出)。


3.6 如何批量删除混在汉字里的英文字母?
[url]http://bbs.et8.net/bbs/showthread.php?t=610345[/url]

现在有什么好办法把导出的文件中夹杂的汉语拼音删掉呢?

阿a尔巴尼亚
挨饿
哀而不伤
阿a拉伯bo
安理会hui


支持正则表达式的编辑器都可以啊。搜索:[a-zA-Z]+,替换为空。



3.7 一个文字替换的问题,可能要用到表达式来实现...已解决
[url]http://bbs.et8.net/bbs/showthread.php?t=581615[/url]
比如格式如下

寻找从#开始,@结束的一段文字,在后面加字符$,也即使
#...@
替换成
#...@$
其中...部分中的文字保持不变,别告送我直接用@替换成@$,因为文档里面有很多不相关的@,所以一定得寻找从#开始,@结束的一段才行

UE,configuration的find要选中unix风格的正则表达式。
[code]查找:#(.*[\S\s\p]*)@
替换为:#\1@$[/code]



3.8 TC批量更名问题
[url]http://bbs.et8.net/bbs/showthread.php?t=556109[/url]
我说的是例子....实际我要改的是
[Kyou_kara_Ma_Ou][002v2][jap_chn][xvid_bf].avi
[Kyou_kara_Ma_Ou][011][jap_chn][xvid_bf].avi
[Kyou_kara_Ma_Ou][012][jap_chn][xvid_bf].avi
[Kyou_kara_Ma_Ou][013][jap_chn][xvid_bf].avi
[x][Kyou_kara_Ma_Ou][16][jp_cn][XviD].rmvb

这类的...保留数字....[C]是固定排列数字的
顺序没有规则,应该不能用[C]
文件头不同,应该也不能保留范围..
能否查找字符并命名为所找字符?


以这5个文件为例,我特意把其中一个文件名数字部分前后的方括号内的部分加上数字,如果文件名是[]组成的几部分,其中要保留部分以数字开头,其余都是非数字开头,TC中用mulitrename tool,选中“RegEx”,搜索&替换中:
代码:
[code]
search for: \[\D*.*\]\[(\d*[a-zA-Z0-9]*)\]\[.*\]
Replace with: $1 [/code]




3.9 如何在指定文字间添加相关内容(内详)
[url]http://bbs.et8.net/bbs/showthread.php?t=640503[/url]
手上有一份缩略语列表,想导入词典软件,需要在缩略语与全称间加入“|”,在每行末尾加上“\r\n”(见贴图),请问有什么简便方法完成上述操作? 谢谢!


regular expression (tested in regexbuddy)
search: (^[\w-]+)(.+)
replace: $1 | $2 \\r\\n

emeditor:
search: (^[\w-]+)(.+)
replace: \1 | \2 \\r\\n




3.10 怎样让一段文字每个字之间都有空格
[url]http://bbs.et8.net/bbs/showthread.php?t=642723[/url]
就是打完一段文字后,要使每个字之间都加一个空格,怎么替换?

emeditor replace (check regular expressions)
find: (.)
replace: \1 (note: there is a space after \1)



3.11 如何从文本文件中提取邮件地址
[url]http://bbs.et8.net/bbs/showthread.php?t=510264[/url]
情况是这样的,在一个大的文本文件里,有许多电子邮件的地址,格式如下
...........................................

............................................

.........................

.................................
现在的问题是:有没有什么软件能把整个文本文件里的电子邮件地址全部都提取出来,而不需要手工一个个去找。
ultraedit可以做到吗?如何做?是不是要采用正规表达之类的手段?


用ue:
find:mailto:*>
选中“regular expression”和“list lines containing string”,find next,
所有含邮件地址的行选出来,clipboard,粘贴,再替换掉没用的头、尾。



3.12 中文名文件转换标准数字文件名,求最简单最快方法,学院派测试题,有兴趣的人请来试试
[url]http://bbs.et8.net/bbs/showthread.php?t=625172[/url]
最近看1本小说 名字是中文的
第 一 章.txt
第 二 章.txt
第 三 章.txt
.
.
第九十章.txt
第九十一章.txt
.
.
第九十九章.txt
第一○○章.txt
第一○二章.txt
.
.
第一一一章.txt

大家也知道 在合并或者排版时候,有时候需要排序,此时要处理文件名,修改为标准的,比如第1章 或者对此文应该为 第001章或者根本就修改为001章.... 111章
但是要注意,在本题中 第一到第九章文件名字有空格,还有第九十九章后面是第一○○章,注意这个○那位程序员能编辑1个程序或者脚本来自动完成这个最好,或者熟悉正则表达式的高手来试试看 ,求最简单修改文件名办法,拜谢!


惭愧惭愧,漏掉了考虑"第 十 章.txt ”,“第十八章.txt”等的情况,因为当时没模板,只是随便构造了几个文件. 谢谢slownet兄指出.
现根据Hermit给的文件模板和参考slownet兄的方法,修改以前的方法如下
Total Commander 6.5:
1. ctl+A 全选, ctl+M 启动TC 批量更名工具:
一| 十|第十|十章|二|三|四|五|六|七|八|九|十|○|序| |第|章
-> 1|10|1|0|2|3|4|5|6|7|8|9| |0|0

2. 第一步结束后,接着在同一TC 批量更名窗口按F5, 选regex
1.txt -> 001.txt : ^([\d])\. -> 00$1.
20.txt -> 020.txt : ^([\d]{2})\. -> 0$1.





针对Hermit给的文件模板,用Total commander 6.5的批量重命名工具可以两步完成。
受jiuk2k的启发,在他的基础上改进,因为他的方法中第1步不能正常处理“第 十 章.txt”,“第八十章.txt”,“第十八章.txt”等。

修改步骤:

1. 首先修改wincmd.ini:
[configuration]
SortUpper=2(或者3)
(该选项在重启TC后生效)

2. 选择全部文件,ctrl+M,search for写:
代码:
[code]
十|○|九|八|七|六|五|四|三|二|一|第十|十章|十|第|章|
[/code]

replace with写:

代码:
[code]
10|0|9|8|7|6|5|4|3|2|1|1|0
[/code]
其中代表一个空格。这个空格不能省略。
现在预览窗口内已经看到效果了,我挨个检查过,全部正确。start,改名完成后按F5(或start旁边的那个按钮),把file name那里原来的[N]改为[C],define counter的digits改为3。改名,完成。
如果连“序 章.txt”也想改名,比如000.txt,只要在上面搜索多加“序”,对应替换“0”。

说明:
1. 必须TC 6.5。
2. 搜索和替换按顺序是一一对应的。这是6.5的新增功能:同时搜索、替换多个字符串。
3. 搜索字符串的先后顺序是有要求的,比如单个空格替换为空,这项必须写在最后,否则无法正确处理“第 十 章.txt”,搜索字符串的第1项就专门针对这个文件。后面的“第十”替换为1,针对“第十一章.txt”等9个文件,“十章”替换为0,针对“第二十章.txt”等8个文件。



3.13 Total Commander拷贝时自动重命名
[url]http://bbs.et8.net/bbs/showthread.php?t=626973[/url]

1,copy第3层子目录下的文件到目标路径,tc可以否?
想了个cmd的
代码:
[code]dir /s/b/a:d >d.txt
for /f "tokens=1-4 delims=\" %i in (d.txt) do echo n | xcopy /e "%i\%j\%k\%l" 目标路径[/code]


search对话框,选plugin tab, check "search in plugins"
plugin: TC, property: path, op: regex, value: ([^\\]+\\){3}
then feed to listbox







3.14 如何批量修改快捷方式?
[url]http://bbs.et8.net/bbs/showthread.php?t=646841[/url]
把所有的C:\XXXXXXX改为D:\XXXXXXXXX

powergrep->replace
check regular expression and search binary files

代码:
[code]
search: c:(\\\w[\\\w\d \.]*.exe)
replace: d:$1
folder: where you put your 快捷方式 file
file mask: *.lnk
[/code]




3.15 Totalcmd如何一次提取N个快捷方式的实际地址?
[url]http://bbs.et8.net/bbs/showthread.php?t=629458[/url]

powergrep->collect:

search: ([cdefgh]:\\\w[\\\w\d\. ]*.exe)
collect: $1
folder: specify it by yourself
file mask: *.lnk

check regualr expression, search binary files
uncheck seperate each file
[img]http://bbs.et8.net/bbs/attachment.php?attachmentid=295486&stc=1[/img] 转自:http://bbs.et8.net/bbs/archive/index.php/t-653055.html