正则指引(第2版)

正则指引(第2版)

Cover
Cover
Date
Categories
计算机-编程设计
ISBN
9787121351303
BookId
25462636
ReadingTime
1时55分
Status
在读
Author
余晟
Rating
75.5%
Sort
1660913853
Progress
14

第1章 字符组

pattern两端加上^和$。^和$是正则表达式中的特殊字符,它们并不匹配任何字符,只是表示“定位到字符串的起始位置”和“定位到字符串的结束位置”
如果要在字符组内部使用横线-,最好的办法是将它排列在字符组的开头。[-09]就是包含三个字符-、0、9的字符组;[0-9]是包含0~9这10个字符的字符组,[-0-9]则是由“-范围表示法”0-9和横线-共同组成的字符组,它可以匹配11个字符,例1-9说明了使用横线-的各种情况。
正则表达式中的每个反斜线字符\,在字符串中(也就是正则表达式之外)还必须转义为\\。
只有开方括号[需要转义,闭方括号]不需要转义,
除了开方括号[之后的^,排除型字符组的用法与普通字符组几乎完全相同,唯一需要改动的是:在排除型字符组中,如果需要表示横线字符-(而不是用于“-范围表示法”),那么-应该紧跟在^之后;而在普通字符组中,作为普通字符的横线-应该紧跟在开方括号之后,如例1-15所示。
\d等价于[0-9],其中的d代表“数字(digit)”;\w等价于[0-9a-zA-Z_],其中的w代表“单词字符(word)”;\s等价于[\t\r\n\v\f](第一个字符是空格),s表示“空白字符(space)
字符组简记法中的“单词字符”不只有大小写单词,还包括数字字符和下画线_
在同一个字符组中并列两个互补的简记法,这种做法有点奇怪,不过仔细想想就会明白,\s和\S组合在一起,匹配的就是“所有的字符”(或者叫“任意字符”)。许多语言中的正则表达式并没有直接提供“任意字符”的表示法,所以[\s\S]、[\w\W]、[\d\D]虽然看起来有点古怪,但确实可以匹配任意字符
不同的语言可能有一些专属的独特的字符组简记法,比如Java 8就提供了\h、\v两种,前者匹配“任何水平方向的空白字符”,后者匹配“任何垂直方向的空白字符”。在某些具体场景下,它们确实很方便,只是不熟悉的读者阅读起来会有点困难。
POSIX字符组的使用也与PCRE字符组简记法的使用有所不同,主要区别在于,PCRE字符组简记法可以脱离方括号直接出现,而POSIX字符组必须出现在方括号内。所以同样是匹配数字字符,PCRE中可以直接写\d,而POSIX字符组必须写成[[:digit:]]。

第2章 量词

最好使用{0,n}的记法,因为它是被广泛支持的。
<[^>]+>
匹配几类tag的表达式
使用合适的结构(包括字符组和量词),精确表达自己的意图,界定能匹配的文本。
在tag内部的字符串不能以/开头,也不能以/结尾,如果这个字符串只包含一个字符,那么它既是开头,又是结尾,使用两个排除型字符组显然是不合适的,看起来没办法解决了。其实,也只是现有的知识还不足够解决这个问题而已,在第69页有这个问题的详细解法。
有一个字符不能由点号匹配,就是换行符\n。这个字符平时看不见,却存在,而且在处理时并不能忽略
如果非要匹配“任意字符”,有两种办法:可以指定使用单行匹配模式,在这种模式下,点号可以匹配换行符(☞86);或者使用第1章介绍的“自制”通配字符组[\s\S](也可以使用[\d\D]或[\w\W])
表达式".*"对字符串"quoted string"的匹配过程
如果要准确匹配双引号字符串,就不能图省事使用".*",而要使用"[^"]*"
换个角度,通过改变[\s\S]*的匹配策略来解决问题:在不确定是否要匹配的场合,先尝试不匹配的选择,测试正则表达式中后面的元素,如果失败,再退回来尝试.*匹配,如此就没有问题了。
匹配优先量词与忽略优先量词