精通正则表达式( Mastering Regular Expressions) [Third Edition]
读者最好能养成按照字符来理解正则表达式的习惯.(p.8)
如果连字符出现在字符组的开头, 他表示的就是一个普通字符, 而不是一个范围. 同样的道理, 问号和点号通常被当作元字符处理, 但在字符组中则不是如此(说明白一点就是, [0-9A-Z_!.?]里面, 真正的特殊字符只有那两个连字符).(p.9)
请记住, 排除行字符组表示"匹配一个未列出的字符(match a character that's not listed)", 而不是"不要匹配列出的字符(don't match what is listed)".
…
在字符组里面和外面, 元字符的定义和意义是不一样的.(p.11)
一个字符组智能匹配目标文本中的单个字符, 而每个多选结构自身可能是完整的正则表达式, 都可以匹配任意长度的文本.(p.13)
请注意, '<'和'>'本身并不是元字符.(p.15)
无论列出的字符有多少, 字符组只能匹配一个字符. 相反, 多选项可以匹配任意长度的文本, 每个多选项可能匹配的文本都是独立的, .... 不过, 多选项没有像字符组那样的排出功能.(p.16)
'u?' 这个元字符与我们之前看到的元字符都不相同, 他只作用于之前紧邻的元素. 因此, 'colour?r' 的意思是: 'c', 然后是'o', 然后是'l', 然后是'o', 然后是'u?', 最后是'r'.(p.17)
正则表达式不是死板的教条, 它更像是门艺术.
…
问号, 加号和星号这3个元字符, 统称为量词(quantifiers), 因为它们限定了所作用元素的匹配次数.(p.18)
…
一个字符组是一个"元素"(unit), 所以它可以直接加加号, 星号等, 而不需要加括号.(p.18)
括号是按照开括号'('从左至右的出现顺序进行的, 所以'([a-z])([0-9])\1\2'中的'\1'代表'[a-z]'匹配的内容, 而'\2'代表'[0-9]'匹配的内容.(p.18)
一个字符组是一个"元素"(unit), 所以它可以直接加加号, 星号等, 而不需要括号.(p.19)
括号是按照开括号'('从左至右的出现顺序进行的, 所以'([a-z])([0-9]) \1\2 '中的'\1'代表'[a-z]'匹配的内容, 而'\2'代表'[0-9]'匹配的内容.(p.21)
真正匹配文本中点号的元序列应该是反斜线(backslash)加上点号的组合:'ega\.att\.com'。 '\.'称为"转义的点号"或者"转义的句号", 这样的办法适用于所有的元字符, 不过在字符组内部无效.
...
如果反斜线后紧跟的不是元字符, 反斜线的意义就依程序的版本而定.(p.22)
变量名
[a-zA-Z_][a-zA-Z_0-9]*
引号内的字符串
"[^"]*"
美元金额
\$[0-9]+(\.[0-9][0-9])?
HTTP/HTML URL
\http://[-a-z0-9_.:]+/[-a-z0-9_:@&?=+,.!/~*%$]*\.html?\
表示时刻的文字, 例如 "9:17 am" 或者 "12:30 pm"
12小时制 (1[012]|[1-9]):[0-5][0-9] (am|pm)
24小时制 (0?[0-9]|1[0-9]|2[0-3]) 尾部同上
或 ([01]?[4-9]|[012]?[0-3]) 尾部同上
(p.27~28)
正则表达式术语汇总
正则 regex
匹配 matching
元字符 metacharacter
流派 flavor
子表达式 subexpression
字符 character