我只看了前面两三章,所以,只简单的记下以前从来没见过的东西 这书的核心是4、5、6章…… 《精通正则表达式》这本书的第四章和第六章比较值得看
1. 多选结构 (mm|gg) 表示匹配 "mm"或"gg" 2. 忽略大小写 s/source/dest/i 搜索source,将其替换为dest,此处的i只对source起作用,而不会作用于dest。 3. 单词分界符 &; 用来匹配单词的开始 &; 用来匹配单词的结束 比如: &;cat 表示匹配以"cat"开头的单词,如cate cat&;匹配以"cat"结尾的单词,如scat 则:&;cat&; 必须精确匹配 "cat" 4. 捕获括号及"反向引用" 在有些支持"反向引用"的地方,括号可以用来表示记忆,这种括号称为捕获括号,在后面,可以通过1、2、3等来引用括号内匹配的表达式。(或用$1、$2等引用) 如:m/&;([A-Za-z]+)s1&;/g 表示搜索两个相邻的,重复的单词。 s表示任意多个空白字符。 1就表示前面 ([A-Za-z]+)匹配到的内容。 所以,这个表达式的意思就是在开始找到一个单词,然后再判断它后面的那个单词,是否是一样的。 注意,如果用 (?:...)括号的话,它就不会起捕获作用了,它只起分组的作用。 5. 字符组 字符组是放在[]中的部分。 它类似于宿主语言中的一个子语言,它里面定义的元字符与宿主语言的很不相同。 [^...] 排除型字符组 6. 一些转义字符 s 可以匹配任何“空白”字符,包括空格、tab、进纸符等。 S 与s相反,除s之外的。(注意,它必要要匹配“字符”!如果不能匹配空) d [0-9],即数字。 D 除d之外的。 w [a-zA-Z0-9],即匹配一个包含数字、字母的单词。 W 除w之外的。 b 可以匹配单词起始 或 单词结束。 7. 环视功能 环视是用来在字符串不匹配任何字符,只匹配文本中的位置,注意,只是位置。 顺序环视:从左至右查看文本,尝试匹配子表达式,如果能够匹配,就返回匹配成功信息。 1) 肯定顺序环视:(?=...) 如: 文本信息为:my test string. 表达式: s/(?=test)/first /i 它就能匹配到test左边的位置! 然后用first 来替换这个位置,因为它只是一个位置,所以实际上就是插入。(实际上就像: s/^/yeah/g 中的^,在每行的开头插入"yeah" 最后经过处理的文本信息为: my first test string. 2) 否定顺序环视:(?!...) 子表达式不能匹配右侧文本。 如:(?!d),就表示该位置的右边不是数字的时候,就匹配成功。 3) 肯定逆序环视:(?<=...) 子表达式能够匹配左侧文本。 如:(?<=ddd),就表示,在该位置的左边,必须是3个数字时才会匹配成功。 如:test321ff,如果用上面的表达式来匹配,最终匹配的位置是1的后面,f的前面。 4) 否定逆序环视:(?<!...) 子表达式不能匹配左侧文本。 8. 条件判断 结构:(?if then |else) 如:(god)?(?(1)pig|ciahi) 这个表达式就能产生这样的效果: 如果"god"参与了匹配,在它之后继续尝试匹配pig,如果god没有参与匹配,就会尝试匹配ciahi。 比如文本是: "godpi is not ciahi", 存在123.txt中。 在perl中使用如下命令: perl -p -e "s/(god)?(?(1)pig|ciahi)/haha/g" 123.txt 就会输出:godpi is not haha 再如:(?(?<=NUMd+|w+) 如果出现了"NUM:",就会在它后面尝试匹配d+,即一些数字。 如果没有出现"NUM:",就只匹配w+,即普通单词。 9. 忽略优先量词 *?、+?、?? 普通的量词*、+、?在匹配的时候,会匹配尽可能多的字符。 如:文本为:who is No. 5555? 则表达式 5+ 会将4个5全都匹配。 而忽略优先量词,匹配的时候只匹配尽可能少的字符。 表达式 5+? 只会匹配1个5.
http://bbs.chinaunix.net/thread-1551620-1-1.html (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|