《精通正则表达式》笔记

来源:互联网 发布:思途cms旅游 价格 编辑:程序博客网 时间:2024/05/01 13:18

 

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]+)/s/1/>/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) 肯定逆序环视:(?<=...)

子表达式能够匹配左侧文本。

如:(?<=/d/d/d),就表示,在该位置的左边,必须是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

再如:(?(?<=NUM:)/d+|/w+)

如果出现了"NUM:",就会在它后面尝试匹配/d+,即一些数字。

如果没有出现"NUM:",就只匹配/w+,即普通单词。

 

9. 忽略优先量词 *?、+?、??

普通的量词*、+、?在匹配的时候,会匹配尽可能多的字符。

如:文本为:who is No. 5555?

则表达式 5+ 会将4个5全都匹配。

而忽略优先量词,匹配的时候只匹配尽可能少的字符。

表达式 5+? 只会匹配1个5.

 

原创粉丝点击