登入帳戶  | 訂單查詢  | 購物車/收銀台( 0 ) | 在線留言板  | 付款方式  | 聯絡我們  | 運費計算  | 幫助中心 |  加入書簽
會員登入 新註冊 | 新用戶登記
HOME新書上架暢銷書架好書推介特價區會員書架精選月讀2023年度TOP分類閱讀雜誌 香港/國際用戶
最新/最熱/最齊全的簡體書網 品種:超過100萬種書,正品正价,放心網購,悭钱省心 送貨:速遞 / EMS,時效:出貨後2-3日

2024年03月出版新書

2024年02月出版新書

2024年01月出版新書

2023年12月出版新書

2023年11月出版新書

2023年10月出版新書

2023年09月出版新書

2023年08月出版新書

2023年07月出版新書

2023年06月出版新書

2023年05月出版新書

2023年04月出版新書

2023年03月出版新書

2023年02月出版新書

『簡體書』正则指引(第2版)

書城自編碼: 3264446
分類: 簡體書→大陸圖書→計算機/網絡程序設計
作者: 余晟
國際書號(ISBN): 9787121351303
出版社: 电子工业出版社
出版日期: 2018-10-01


書度/開本: 16开 釘裝: 平装

售價:NT$ 703

我要買

share:

** 我創建的書架 **
未登入.



新書推薦:
意大利文艺复兴新艺术史
《 意大利文艺复兴新艺术史 》

售價:NT$ 4474.0
2023年《咬文嚼字》合订本(精)
《 2023年《咬文嚼字》合订本(精) 》

售價:NT$ 437.0
世界银行营商环境成熟度方法论手册
《 世界银行营商环境成熟度方法论手册 》

售價:NT$ 1501.0
变革时代的公司契约:法律能否与时俱进?
《 变革时代的公司契约:法律能否与时俱进? 》

售價:NT$ 437.0
我国城乡融合发展基本格局及典型形态研究
《 我国城乡融合发展基本格局及典型形态研究 》

售價:NT$ 386.0
写意兰竹树石课徒稿
《 写意兰竹树石课徒稿 》

售價:NT$ 515.0
不较真的心理智慧
《 不较真的心理智慧 》

售價:NT$ 279.0
漫画算法与数据结构(大规模数据集)
《 漫画算法与数据结构(大规模数据集) 》

售價:NT$ 447.0

建議一齊購買:

+

NT$ 498
《 人人都懂设计模式:从生活中领悟设计模式(Python实现) 》
+

NT$ 644
《 大师访谈录:成就非凡的软件人生 》
+

NT$ 449
《 码农翻身 》
編輯推薦:
来自真实场景与高频问题的妙用法门
覆盖所有主流编程语言及其版本差异
源代码及文本数据处理走向高效之路
贯通编码问题匹配原理解题思路
适用日志分析|网络运维|自动化测试
深入原理结构差异以利现成成果移植
內容簡介:
本书综合作者自己遇到的实际问题,以及其他开发人员咨询的问题,总结出一套巧妙运用正则表达式的办法,并通过具体的例子指导读者拆解、分析问题。全书分为三部分:*部分主要讲解正则表达式的基础知识,涵盖了正则表达式中常见的各种功能和结构;第二部分主要讲解关于正则表达式的更深入的知识,详细探讨了编码问题、匹配原理、解题思路;第三部分将之前介绍的各种知识落实到常用语言.NET、Java、JavaScript、PHP、Python、Ruby、Objective-C、Golang中,在详细介绍了在这些语言中正则表达式的具体用法之外,还辨析了版本之间的细微差异。本书既可以作为专门的学习用书,也可以作为备查的参考手册。
關於作者:
余晟,非正统型技术爱好者,有多年研发经验,目前在在线教育行业从事研发与架构管理的工作。在强调技术追求的同时,倡导全面、完整的技术路线和技术文化,业余写作、翻译、审校了若干技术图书。个人公众号为余晟以为(yurii-says)。
目錄
第一部分
第1章字符组 .................2
1.1普通字符组 ............. 2
1.2关于Python的基础知识........................... 4
1.3普通字符组(续) . 6
1.4元字符与转义 ......... 8
1.5排除型字符组 ....... 10
1.6字符组简记法 ....... 12
1.7字符组运算 ........... 14
1.8POSIX字符组 ...... 15
第2章量词 ...................17
2.1一般形式 ............... 17
2.2常用量词 ............... 19
2.3数据提取 ............... 21
2.4点号....................... 23
2.5滥用点号的问题 ... 23
2.6忽略优先量词 ....... 26
2.7转义....................... 31
第3章括号 ...................33
3.1分组....................... 33
3.2多选结构 ............... 39
3.3引用分组 ............... 44
3.3.1反向引用... 48
3.3.2各种引用的记法 .......................... 50
3.3.3命名分组... 53
3.4非捕获分组 ........... 55
3.5补充....................... 56
3.5.1转义 .......... 56
3.5.2URL Rewrite ................................ 56
3.5.3一个例子... 58
第4章断言 ...................60
4.1单词边界 ............... 60
4.2行起始结束位置 .. 62
4.3环视....................... 69
4.4补充....................... 75
4.4.1环视的价值 .................................. 75
4.4.2环视与分组编号 .......................... 76
4.4.3环视的支持程度 .......................... 77
4.4.4环视的组合 .................................. 79
4.4.5断言和反向引用之间的关系 ...... 81
4.4.6逆序环视的诡异之处 .................. 81
第5章匹配模式 ............83
5.1不区分大小写模式与模式的指定方式 .. 83
5.2单行模式 ............... 86
5.3多行模式 ............... 87
5.4注释模式 ............... 89
5.5补充....................... 91
5.5.1更多的模式 .................................. 91
5.5.2修饰符的作用范围 ...................... 91
5.5.3失效修饰符 .................................. 92
5.5.4模式与反向引用 .......................... 93
5.5.5冲突策略... 93
5.5.6哪种方式更好 .............................. 94
第6章其他 ...................95
6.1转义....................... 95
6.1.1字符串转义与正则转义 .............. 95
6.1.2元字符的转义 .............................. 99
6.1.3彻底消除元字符的特殊含义 .... 101 6.1.4字符组中的转义 ........................ 103
6.2正则表达式的处理形式 ........................ 103
6.2.1函数式处理 ................................ 104
6.2.2面向对象式处理 ........................ 104
6.2.3比较 ........ 105
6.2.4线程安全性 ................................ 106
6.3表达式中的优先级 ................................ 108
6.4回车和换行 ......... 109

第二部分
第7章Unicode ...........112
7.1基础知识 ............. 112
7.2关于编码 ............. 115
7.3尽量使用Unicode编码 ........................ 116
7.4Unicode与字符组简记法 ..................... 120
7.5规范化问题 ......... 122
7.6单词边界 ............. 123
7.7码值转义序列 ..... 125
7.8Unicode属性 ...... 127
7.8.1Unicode Property ....................... 128
7.8.2Unicode Block ........................... 128
7.8.3Unicode Script ........................... 129
7.9Unicode属性列表 ................................. 130
7.9.1Unicode Property ....................... 130
7.9.2Unicode Block ........................... 131
7.9.3Unicode Script ........................... 135
7.10POSIX字符组 .. 135
7.11Emoji ................. 136
第8章匹配原理 ..........138
8.1有穷自动机 ......... 138
8.2正则表达式的匹配过程 ........................ 139
8.3回溯..................... 142
8.4NFA和DFA ....... 144 第9章常见问题的解决思路 ...........................146
9.1关于元素的三种逻辑 ............................ 146
9.1.1必须出现. 147
9.1.2可能出现. 147
9.1.3不能出现. 148
9.2正则表达式的常见操作 ........................ 150
9.2.1提取 ........ 150
9.2.2验证 ........ 156
9.2.3替换 ........ 160
9.2.4切分 ........ 165
9.3正则表达式的优化建议 ........................ 167
9.3.1使用缓存. 167
9.3.2尽量准确地表达意图 ................ 168
9.3.3避免重复匹配 ............................ 168
9.3.4独立出文本和锚点 .................... 169
9.4别过分依赖正则表达式 ........................ 170
9.4.1彻底放弃字符串操作 ................ 170
9.4.2思维定式. 171
9.4.3正则表达式可以匹配各种文本172
9.4.4滥用正则表达式 ........................ 173

第三部分
第10章.NET ..............176
10.1预备知识 ........... 176
10.2正则功能详解 ... 177
10.2.1列表 .... 177
10.2.2字符组178
10.2.3Unicode属性 ......................... 178
10.2.4字符组简记法........................ 179
10.2.5单词边界 ............................... 179
10.2.6行起始结束位置 .................. 180
10.2.7环视 .... 181
10.2.8匹配模式 ............................... 181
10.2.9捕获分组的引用 .................... 182 10.3正则API简介 .. 183
10.3.1Regex .. 183
10.3.2Match .. 187
10.4常用操作示例 ... 188
10.4.1验证 .... 188
10.4.2提取 .... 189
10.4.3替换 .... 189
10.4.4切分 .... 190
第11章Java ..............191
11.1预备知识 ........... 191
11.2正则功能详解 ... 192
11.2.1列表 .... 192
11.2.2字符组. 192
11.2.3Unicode属性 ......................... 194
11.2.4字符组简记法 ........................ 194
11.2.5单词边界 ................................ 194
11.2.6行起始结束位置 ................... 195
11.2.7环视 .... 196
11.2.8匹配模式 ................................ 196
11.2.9纯文本模式 ............................ 197
11.2.10捕获分组的引用 .................. 197
11.3正则API简介 .. 197
11.3.1Pattern . 198
11.3.2Matcher .................................. 200
11.3.3String ... 203
11.4常用操作示例 ... 204
11.4.1验证 .... 204
11.4.2提取 .... 204
11.4.3替换 .... 205
11.4.4切分 .... 206
11.5Java 8和Java 9的新改进 ................... 206
11.5.1Java 8的新改进 ..................... 206
11.5.2Java 9的新改进 ..................... 207 第12章JavaScript .....208
12.1预备知识 ........... 208
12.2正则功能详解 ... 209
12.2.1列表 .... 209
12.2.2字符组210
12.2.3字符组简记法........................ 211
12.2.4单词边界 ............................... 211
12.2.5行起始结束位置 .................. 212
12.2.6环视 .... 212
12.2.7匹配模式 ............................... 213
12.2.8捕获分组的引用 .................... 214
12.3正则API简介 .. 215
12.3.1RegExp 215
12.3.2String ... 218
12.4常用操作示例 ... 221
12.4.1验证 .... 221
12.4.2提取 .... 222
12.4.3替换 .... 223
12.4.4切分 .... 223
12.5关于ActionScript ................................ 223
12.5.1RegExp 223
12.5.2匹配规则 ............................... 224
12.5.3匹配模式 ............................... 224
12.5.4正则API ................................ 224
第13章PHP ...............225
13.1预备知识 ........... 225
13.2正则功能详解 ... 227
13.2.1列表 .... 227
13.2.2字符组228
13.2.3Unicode属性 ......................... 229
13.2.4字符组简记法........................ 229
13.2.5单词边界 ............................... 230
13.2.6行起始结束位置 .................. 230
13.2.7环视 .... 231
13.2.8匹配模式 ............................... 231 13.2.9纯文本模式 ........................... 232
13.2.10捕获分组的引用 .................. 232
13.3正则API简介 .. 233
13.3.1PREG 常量说明 ................... 233
13.3.2preg_quote ............................. 235
內容試閱
引子:关于正则表达式
正则表达式这个名字看起来总有点古怪,概念似乎也不简单,甚至需要用一整本书来讲解。可是,它到底是什么呢?
同为技术人员,我相信你总会与字符串打交道,相应的,各种语言也都提供了与字符串有关的函数。我们先看下面几个问题,用字符串函数是如何解决的(下面的代码使用Python语言,它很直观,正文里有基础的介绍。现在,你只需要知道def是定义函数的关键词即可)。
引入正则表达式
1. 判断字符ch是否是数字字符
def isDigitch :
return ch == "0" or ch == "1" or ch == "9"
2. 判断字符串str是否是电话号码(为简单起见,现在只考虑固定电话号码,也就是长度在7~8位之间的数字字符串,且第一位不为0)
def isPhoneNum str :
if lenstr >= 7 and lenstr <= 8 and str[0] != "0" :
for ch in str :
if not isDigitch :
return false
return true
return false
任务的复杂度并没有增加太多,程序的复杂度增加了很多倍;如果你不同意,那么,来一个更复杂的。
3. 找出一段文本中所有的电话号码
最直接的办法是,在字符串中的每个位置截取7~8个字符,调用之前的isPhoneNum。这么做看起来没问题,只是效率太低。
当然,做点改进也不难,加上一个前置条件,只在当前字符为数字字符的情况下调用isPhoneNum。这样效率倒是改进了,但是还有问题没有解决:要求找到的是长度大于等于7个字符、小于等于8个字符的数字字符串,而不是子字符串也就是说,假如数字字符串是64240000,需要将它找出来;如果数字字符串是13800138000,则需要忽略它,以及其中的任何子串(比如13800138、00138000)。
所以,用isPhoneNum找出字符串之后,还需要保证它之前的字符不是数字字符,之后的字符也不是数字字符。看起来很简单,但合格的程序员一定要考虑边界问题,避免越界错误:如果当前字符是整段文本的第一个字符,则不需要判断之前的字符,因为它不存在;同样,如果找出的字符串在整段文本的末尾,则不需要判断之后的字符,因为它同样不存在
到现在为止,即便只是找到最简单的固定电话号码,程序也非常复杂,难以维护。如果要查找的是形式更多变的文本,比如带区号的电话号码(021-64240000或者03718888888)、手机号码(13800138000、 8613800138000或者013800138000),程序更是不可想象,更不用说文件路径名、URL地址、电子邮件地址了!然而,日常开发中我们又确实经常需要面对这类任务,有什么更好的办法呢?
正则表达式就是解决这类问题的万能药。虽然许多人有点看不起它,觉得不入流,一些科班教材里也不会花太多篇幅来介绍它,但它确实是解决问题的利器之前提到的三个例子,用正则表达式都可以轻松解决。
引入正则表达式之后
1. 判断字符ch是否是数字字符
def isDigitch :
return re.searchch, "[0-9]" != None
看起来很复杂,其实并不复杂:这里真正要关心的就是正则表达式[0-9],它表示从0到9之间的任意字符,很形象吧?re.search是正则表达式运算函数,它判断ch能否由正则表达式[0-9]匹配,可以则返回一个结果,否则返回None(这些细节正文中会讲到)。
2. 判断字符串str是否是电话号码
def isPhoneNumstr :
return re.searchstr, "[1-9][0-9]{6,7}" != None
这个正则表达式最开始是[1-9],表示第一个字符必须是1~9之间的数字字符;之后是[0-9]{6,7},表示长度在6和7之间,由0~9之间的数字字符组成的字符串(两部分加起来,整个字符串的长度在7和8之间)。要解决的问题复杂了,正则表达式仍然直观形象。
3. 找出一段文本中所有的固定电话号码
def findNumStrstr :
return re.findallstr, ?<![0-9][1-9][0-9]{6,7}?![0-9]
这个正则表达式之前多出了?<![0-9],表示之前不能是[0-9];之后多出了?![0-9],表示之后不能是[0-9]。虽然稍微复杂点,但意思明确,而且不难理解。re.findall的意思也很明显:找到所有这样的字符串。
可以想象,循着这种思路,查找更复杂的电话号码、手机号码等任务都不难解决。更重要的是,之前需要许多行语句才能完成的任务,现在基本上只需要一个正则表达式、一条语句就可以完成。正因为如此,不少人虽然认为正则表达式不够花哨、漂亮,却不得不承认它是一种匕首应用匕首,没有十八般兵刃那么气派,关键时候却不可或缺,所以值得花时间练练。同样,正则表达式虽然不能用来显摆,但总有派得上用场的地方,花时间练练绝不是坏事。即便你的工作不是纯粹的文本处理(比如日志分析),也总会有用到正则表达式的地方(比如查找和修改源代码),所以我希望,这本书能陪伴你练出一身正则表达式的好功夫,在关键场合能亮出称手的工具。
最后,为了传承经典教科书的良好习惯,附上正则表达式的科班史。
正则表达式发源于与计算机密切相关的两个领域:计算理论和形式语言。20世纪40年代,两位神经生理学家Warren McCulloch和Walter Pitts发明了一种用数学方式来描述神经网络的办法,他们把神经系统中的神经元描述成小而简单的自动控制单元。1956年,数学家Stephen Cole Kleene在他们研究的基础上,发表了一篇名为《神经网事件的表示法》的论文,在其中,他采用了一些称之为正则集合(regular set)的数学符号来描述神经网络模型。
之后,UNIX的主要发明人Ken Thompson将这个符号系统引入了文本编辑器QED(意思是在文本中搜索某种模式),正则表达式由此也进入了计算机世界。随后Ken Thompson又将正则表达式引入了UNIX下的文本编辑器ed,ed最终演化为大家熟悉的grep(grep得名自ed编辑器中的正则表达式搜索命令grep,其中的re表示正则表达式)。
返璞归真评《正则指引》
第一次接触正则表达式,是2000年我在西安一家公司使用Perl做网站开发时。之前我在工作中只使用过标准的C语言,Perl这门编程语言的强大表达能力,令我印象极为深刻。Perl的力量,除了语言本身的设计之外,很大程度上来自它对正则表达式的完美支持。当时我们开发了一个网上商城的应用,允许很多商家在这里开店,可以选择一些不同的样式模板。我很快发现,使用Perl 正则表达式是开发这类应用的利器。我们只花了大约一个月的时间,就完成了网站核心功能的开发。那时候我意识到,使用正则表达式是聪明人写程序的方法(没说我是聪明人,但是我非常希望与那些聪明人为伍),可以极大地提高代码的重用度和执行效率。如果完全不使用正则表达式,代码量会增加数倍甚至数十倍。
后来因为一些原因,我告别了Perl。在之后的工作中,我使用过Java、JavaScript、Ruby等编程语言。我发现这些语言对于正则表达式的支持,没有一个能够超越Perl。Java这种所谓的工业主流编程语言,一直到2002年JDK 1.4推出时,才正式把对正则表达式的支持加入核心类库。因为长期缺乏对正则表达式的原生支持,以及语言本身表达能力欠缺,使用Java来做大量的文本处理,感觉非常笨拙,完全没有使用Perl那种指哪打哪的快感。直到2007年我发现了另一个更好的Perl语言Ruby,才重新找回了2000年Perl带给我的编程快感。
因为我的工作主要是做Web开发,大量的时间花在与HTMLCSSJavaScript以及关系数据库打交道上。在这里并没有很高深的算法,只有大量繁重的文本处理。难以想象,如果没有正则表达式,我们的开发将会是何等原始。
除了Web开发领域,需要实现大量自动化功能的一些领域,例如运维领域和自动化测试领域,也是正则表达式大显身手的地方。无论使用稍显简陋的sedawk还是更高级的PerlPythonRuby,实现自动化功能,都必须依赖大量的正则表达式。
自从面向对象的编辑方式时髦起来之后,甚至一度出现了面向对象万能论,有人试图用MDA和可执行的UML来解决一切编程问题。但是我一直认为面向对象只解决了软件开发的一小部分问题,而且是宏观方面的问题。正则表达式解决的问题,是面向对象无能为力的一些微观方面的问题。在这里不需要坐而论道的方法论争论,需要的是刺刀见红的肉搏战。这些问题即使使用完全面向对象的方式能够解决,也会是很笨拙的。如果用物理学来比喻,面向对象是广义相对论,而正则表达式则是量子力学。
正则表达式已经成为现代编程语言的基础模块,现在很难找到一种不支持正则表达式的编程语言。除了编程语言外,在很多工具软件,例如文本编辑器(Vi、Emacs、UltraEdit)、Web服务器(Apache、Nginx)中都能找到正则表达式的身影。
余晟老师是我的朋友,我对他印象最为深刻的是他对于技术工作的严谨态度。格物致知是中国传统儒家学派所追求的一种道德修养,也是一种境界。余老师是我的朋友中

 

 

書城介紹  | 合作申請 | 索要書目  | 新手入門 | 聯絡方式  | 幫助中心 | 找書說明  | 送貨方式 | 付款方式 香港用户  | 台灣用户 | 海外用户
megBook.com.tw
Copyright (C) 2013 - 2024 (香港)大書城有限公司 All Rights Reserved.