加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

精通正则表达式

发布时间:2020-12-13 19:32:48 所属栏目:百科 来源:网络整理
导读:我只看了前面两三章 ,所以,只简单的记下以前从来没见过的东西 这书的核心是4、5、6章…… 《精通正则表达式》这本书的第四章和第六章比较值得看 1. 多选结构 (mm|gg) 表示匹配 "mm"或"gg" 2. 忽略大小写 s/source/dest/i 搜索source,将其替换为dest,此处

我只看了前面两三章,所以,只简单的记下以前从来没见过的东西
这书的核心是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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读