[笔记] 精通正则表达式/Mastering Regular Expressions

时间:2021-04-08 15:13:25

/ 匹配<emphasis>这个tag标注的IP地址的RE:‘<emphasis>([0-9]+(\.[0-9]+){3})</emphasis>'

/ 锚定--anchor

/ 最好能养成按照字符来理解RE的习惯:例如 '^cat',不要理解为匹配以cat开头的行,而应该理解为匹配以c作为一行的第一个字符,紧接一个a,紧接一个t的文本;

/ '^$'匹配的是没有任何字符,包括空白字符的空行;

/ ^和$匹配的是一个位置,不是文本;

/ 问号和点号在字符租([])里不是元字符;

/ 排除--negate

/ egrep会在检查RE之前把文本行末尾的换行符去掉;

/ 'gr(a|e)y'中用括号来划定多选结构的范围(正常情况下,括号也是元字符);

/ 一个字符组([])只能匹配目标文本中的单个字符,而每个多选结构自身都可能是完整的RE,都可以匹配任意长度的文本;

/ 限制--constrain 不去分大小写--case-insensitive;

/ '\<'和'\>'用来匹配单词的开头和结束位置,其中<、>本身并不是元字符,只有当它们与斜线结合起来的时候,整个序列才具有特殊意义,这就是它们被称为“元字符序列”的原因;

/ “单词的起始位置”是一系列字母和数字(注意不包括符号)开始的位置,“结束位置”就是它们结尾的地方;

/ 问号表示可选项,把它加在一个字符后面,表示此处容许出现这个字符,不过他的出现并非匹配成功的必要条件;

/ 空格符也是普通字符之一;

/ 反向引用(backreference)引用的顺序是按照开括号从左到右出现的顺序进行的;

/ 反斜线--backslash 转义符--escape

/ 匹配引号内的字符串最简单的表达式:'  "[^"]*"  '

/ 匹配"12:30 pm"---'(1[012]|[1-9]):[1-5][0-9] (am|pm)'

/ 处理24小时制时间:把时间分为三部分:其一是上午(小时数从00到09,开头的0可选),其二是白天(小时数从10到19),其三是夜晚(小时数从20到23)--'0?[0-9]|1[0-9]|2[0-3]'

/ 由星号和问号限定的对象在“匹配成功”时可能并没有匹配任何字符,即使什么字符都不能匹配到,他们仍然会报告“匹配成功”;

/ '(?:...)'表示只分组不捕获;

/ '[□\t]*'与'(□*|\t*)'的异同:前者可以匹配若干空格符(也可以没有)以及若干制表符(也可以没有),不过并不容许制表符与空格符发的混合体;相反,前者能够匹配任意多个'□\t',对于字符串'\t□□',他可以匹配三次,第一次是制表符,后两次是空格符。

/ \s是表示所有表示空白字符(whitespace character)的字符组,包括空格符、制表符、换行符和回车符;

/ 修饰符---modifier 替换--substitution 订阅--subscription

/ 要求:保留小数点后两位数字,如果第三位不为零则也需要保留,去掉去他的数字,例如12.3750000000392或者12.375会被修正为'12.375',而37.500会被修正为'37.50',RE为s/(\.\d\d[1-9]?)\d*/$1/

/ 在字符组中的元字符不同于正在表达式中的元字符,在字符组内部,括号不再具有特殊含义,也不需要转义;

/ '^From:□(\s+)□\(([^()]*)\)'--\(、\)普通括号字符;

/ POSIX字符组:

[:alpha:]--字母字符

[:digit:]--数字字符

[:alnum:]--字母字符和数字字符

[:blank:]--空格和制表符

[:space:]--所有的空白字符([:blank:]、换行符、回车符及其他)

[:cntrl:]--控制字符

[:graph:]--非空字符(即空白字符、控制字符之外的字符)

[:print:]--类似[:graph:],但是包含空白字符

[:punct:]--标点符号

[:xdigit:]--十六进制中允许出现的数字(例如0-9a-fA-F)

[:lower:]--小写字母

[:upper:]--大写字母

/ 忽略优先量词:*?、+?、??、{num,num}?

量词在正常情况下都是“匹配优先(greedy)的”,匹配尽可能多的内容;相反,忽略优先量词会匹配尽可能少的内容,只需要满足下限,匹配就能成功;

/ 由星号限定的部分总是能够匹配,如果整个表达式都是由星号控制,它就能够匹配任何内容;

/ 匹配以反斜杠及换行符结尾的多行:'^\w+=[^\n\\]*(\\\n[^\n\\]*)*'

/ 匹配IP:'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}',如果不支持,则可以用'\d\d?\d?'或者'\d(\d\d?)?'

/ 所在路径及文件名:'^(.*)/([^/]*)$'

/ 正则表达式无法匹配任意深度的嵌套结构;(例如多层括号嵌套);

/ 如果某个元素的匹配没有硬性规定任何必须出现的字符,那么他总能匹配成功;

/