读《学习正则表达式》(2)
第6章 匹配Unicode和其他字符
匹配ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)范围之外的字符。
测试文本法文:
https://github.com/michaeljamesfitzgerald/Introducing-Regular-Expressions/blob/master/voltaire.txt
"Qu’est-ce que la tolérance? c’est l’apanage de l’humanité. Nous sommes tous pétris de faiblesses et d’erreurs; pardonnons-nous réciproquement nos sottises, c’est la première loi de la nature." —Voltaire (1694–1778)
测试文本日文:
https://github.com/michaeljamesfitzgerald/Introducing-Regular-Expressions/blob/master/basho.txt
古池
蛙飛び込む
水の音
—芭蕉 (1644–1694)
At the ancient pond
a frog plunges into
the sound of water.
—Basho (1644–1694)
测试文本德文:
https://github.com/michaeljamesfitzgerald/Introducing-Regular-Expressions/blob/master/schiller.txt
An die Freude.
Freude, schöner Götterfunken,
Tochter aus Elisium,
Wir betreten feuertrunken
Himmlische, dein Heiligthum.
Deine Zauber binden wieder,
was der Mode Schwerd getheilt;
Bettler werden Fürstenbrüder,
wo dein sanfter Flügel weilt.
Seid umschlungen, Millionen!
Diesen Kuß der ganzen Welt!
Brüder, überm Sternenzelt
muß ein lieber Vater wohnen.
6.1 匹配Unicode字符
# 匹配法文中的é
\u00e9
\xe9
# 匹配日文中的池
\u6c60
# 匹配长破折号
\u2014
6.2 使用八进制数匹配字符
\351
\u00e9
6.3 匹配Unicode字符属性
6.4 匹配控制字符
6.5 本章所学
- 如何使用\uxxxx或\xxx匹配任意Unicode字符
- 如何在vim中使用%xxx
- 如何用八进制格式\ooo匹配0-255范围内的字符
- 如何通过\p{x}来使用Unicode字符属性
- 如何用\e或\cH匹配控制字符
第7章 量词
测试文本
https://github.com/michaeljamesfitzgerald/Introducing-Regular-Expressions/blob/master/triangle.txt
1
22
333
4444
55555
666666
7777777
88888888
999999999
0000000000
7.1 贪心、懒惰和占有
贪心:
量词默认是贪心的。会首先匹配整个字符串,尝试匹配失败时,回退一个字符后再次尝试,这个过程叫回溯。三种方式,贪心对资源的消耗最大
懒惰:
也叫勉强,从目标的起始位置开始尝试寻找匹配。
普通量词后加?就是懒惰量词了
占有:
会覆盖整个目标然后尝试寻找匹配内容,但它只尝试一次,不会回溯。
普通量词后加+就是占有量词了
7.2 用*、+和?进行匹配
.*
9*
基本量词
? 零个或一个
+ 一个或多个
* 零个或多个
7.3 匹配特定次数
范围语法总结
{n} 精确匹配n次
{n,} 匹配n次或更多次
{m,n} 匹配m次至n次
{0,1} 与?相同
{1,0} 与+相同
{0,} 与*相同
7.4 懒惰量词
懒惰量词
?? 懒惰匹配零次或一次
+? 懒惰匹配一次或多次
*? 懒惰匹配零次或多次
{n}? 懒惰匹配n次
{n,}? 懒惰匹配n次或多次
{m,n}? 懒惰匹配m至n次
7.5 占有量词
占有量词
?+
++
*+
{n}+
{n,}+
{m,n}+
7.6 本章所学
- 贪心式、懒惰式以及占有式匹配的区别
- 如何匹配一次或多次(+)
- 如何进行可选匹配(?,零次或一次)
- 如何匹配零次或多次(*)
- 如何使用{m,n}量词
- 如何使用贪心、懒惰(勉强)以及占有量词
第8章 环视
环视是一种非捕获分组,它根据某个模式之前或之后中的内容匹配其他模式。环视也称为零宽度断言。
8.1 正前瞻
8.2 反前瞻
8.3 正后顾
8.4 反后顾
8.5 本章所学
- 如何使用正前瞻和反前瞻
- 如何使用下后顾和反后顾
第9章 用HTML标记文档
9.1 匹配标签
匹配HTML或XML标签
<[_a-zA-Z][^>]*>
grep -Eo '<[_a-zA-Z][^>]*>' lorem.dita
9.2 用sed转换普通文本
插入html头
sed '1 i\
<!DOCTYPE html>\
<html lang="en">\
<head>\
<title>The Rime of the Ancyent Marinere(1798)</title>\
<meta charset="utf-8">\
</head>\
<body>\
q' rime.txt
9.2 用sed进行替换
处理标题,加<h1>
sed '1s#^\(.*\)$#<h1>\1</h1>#;q' rime.txt
将前两步合为一步
sed -E '1s#^(.*)$#<!DOCTYPE html>\
<html lang="en">\
<head>\
<title>The Rime of the Ancyent Marinere(1798)</title>\
<meta charset="utf-8">\
</head>\
<body>\
<h1>\1</h1>\
#;q' rime.txt
处理罗马数字,加<h2>
sed -En 's#^(ARGUMENT\.|I{0,3}V?I{0,2}\.)#<h1>\1</h2>#p' rime.txt
处理特定段落,加<p>
sed -En '5s#^([A-Z].*)$#<p>\1</p>#p' rime.txt
处理多行诗文
sed -E '9s#^[ ]*(.*)# <p>\1<br/>#;10,832s#^([ ]{5,7}.*)#\1<br/>#;833s#^(.*)#\1</p>#' rime.txt
# 说明
第9行 加<p>xxx<br/>
第10到832行 加xxx<br/>
第833行 加</p>
9.3 追加标签
在诗文的结尾添加一些标签
sed '$ a\
</body>\
</html>\
' rime.txt
使用sed命令文件
html.sed
#!/usr/bin/sed
1s/^(.*)$/<!DOCTYPE html>\
<html lang="en">\
<head>\
<title>\1<\/title>\
<\/head>\
<body>\
<h1>\1<\/h1>\
/
s/^(ARGUMENT|I{0,3}V?I{0,2})\.$/<h2>\1<\/h2>/
5s/^([A-Z].*)$/<p>\1<\/p>/
9s/^[ ]*(.*)/ <p>\1<br\/>/
10,832s/^([ ]{5,7}.*)/\1<br\/>/
833s/^(.*)/\1<\/p>/
s/^$/<br\/>/
$ a\
<\/body>\
<\/html>\
执行脚本
sed -E -f html.sed rime.txt > rime.html
9.4 用perl转换普通文本
9.5 本章所学
- 如何在命令行中使用sed
- 如何使用sed在前方添加(插入)、替换以及在尾部附加文本(及标签)
- 如何使用Perl做同样的事情
第10章 初级班毕业了
Unix不会阻止用户干蠢事,因为那样也会妨碍用户做聪明的事。—Doug Gwyn
10.1 想上中级班
- 《精通正则表达式(第3版)》电子工业出版社(2007)
- 《正则表达式经典实例》东南大学出版社(2010)
- 《正则表达式入门经典》清华大学出版社(2008)
10.2 工具、实现程序有及程序库
Perl:
不一定要学习Perl,但有必要在你的工具箱中保留Perl。
《Perl语言入门(第6版)》东南大学出版社(2012)
PCRE:
PCRE(Perl Compatible Regular ExpressionPerl,Perl兼容正则表达式),是一个用C语言编写的(8位和16位)的正则表达式库,参见http://www.pcre.org。
pcregrep是一个类似grep的8位工具程序,它可以让你在命令行中使用PCRE的特性。
Ruby(Oniguruma):
Oniguruma是Ruby1.9内置的正则表达式库。它是用C语言编写的,专门支持Ruby。可以用Rubular测试Ruby正则表达式,在线应用http://rubular.com ,支持1.8.7和1.9.2。TextMate就是用了Oniguruma库。
Python:
RE2:
RE2是个非回溯的C++正则表达式库http://code.google.com/p/re2(https://github.com/google/re2)。 虽然RE2的速度很快,但是它不做回溯操作和后向引用。它是以Perl的CPAN包的形式来使用的,后向引用要依赖Perl的本地程序库完成。
10.3 匹配北美电话号码
^\(?(?:\d{3})\)?[-.]?(?:\d{3})[-.]?(?:\d{4})$
10.4 匹配电子邮件地址
^([\w-.!#$%&'*+-/=?^_`{|}~]+)@((?:\w+\.)+)(?:[a-zA-Z]{2,4})$
# 说明
一个正常的邮箱example@abc.com
@前边允许的字符\w-.!#$%&'*+-/=?_`{|}~
@后边((?:\w+\.)+)(?:[a-zA-Z]{2,4})
10.5 本章所学
- 如何从文件中提取XML元素列表并将其转换为XSLT样式表
- 从哪里在可以找到其他学习正则表达式的资源
- 值得推荐的正则表达式工具、实现程序以及程序库
- 更为可靠的匹配北美电话号码的模式