读《学习正则表达式》(2)

读《学习正则表达式》(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

http://regexhero.net/tester

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样式表
  • 从哪里在可以找到其他学习正则表达式的资源
  • 值得推荐的正则表达式工具、实现程序以及程序库
  • 更为可靠的匹配北美电话号码的模式

附录 正则表达式参考

QED中的正则表达式

元字符

字符简写式

空白符

Unicode空白字符

控制字符

字符属性

各种字符属性的脚本名称

POSIX字符组

选项与修饰符

正则表达式与ASCII码表

转载于:https://my.oschina.net/yysue/blog/1621437

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值