如何使用正则表达式进行多行代码或文本的批量替换?正则表达式regex有三种匹配模式:单行模式、多行模式、区分大小写模式
本文以php代码和Regex Match Tracer工具为例向大家介绍使用正则表达式进行多行代码批量替换的方法。
一、单行模式SingleLine
关键字:s
描述:正则在单行模式的情况下会改变(.)点号的含义,why?【这里可能大家有个误区,普遍认为(.)点号是匹配任意字符的,但是实际上(.)点号是不能匹配换行符的,在windows中它与[^\r\n]是等价的】
$text = '<div id="div"> 123 abc 456 def </div>';preg_match('/<div\s*id\s*=\s*[\'"]div[\'"]>(.*)<\/div>/', $text, $match);var_dump($match);# 返回的结果是array(0){}
因为在很多情况下我们都会使用到单行模式,比如经常会获取html网页源码,然后进行重点匹配某些内容,那html源码存在很多的换行和回车符,这个时候单行模式就很有作用了,上边的代码正则字符串中没有使用任何的修饰符(<div\s*id\s*=\s*[\'"]div[\'"]>(.*)<\/div>),直接进行匹配发现匹配失败,原因上边已经说了就是(.)点号是不能匹配换行符的,这是个误区(注意),下面我们在正则表达式上添加单行模式关键字s来进行匹配:
$text = '<div id="div"> 123 abc 456 def </div>';preg_match('/<div\s*id\s*=\s*[\'"]div[\'"]>(.*)<\/div>/s', $text, $match);var_dump($match['1']);# 返回的结果是: //string(30) " // 123 // abc // 456 // def //"
重要的事情说三遍:(.)点号不匹配换行符,在windows中与[^\r\n]等价,并不是刻意匹配任意字符
二、多行模式MultiLine(使用php来操作看的不是很明显)
关键字:m
描述:多行模式下会改变^和$的含义【^和$是匹配整个字符串的开头和结尾】,使它在任意一行的行首和行尾进行匹配
扩展:在支持此模式的程序通常都提供\A和\Z两种修饰符,他们跟普通的^和$是一样的作用,但是^和$在多行模式下会改变含义,而\A和\Z他们的含义始终不会被改变,一直都匹配整个字符的开头和结尾
这是没有选择多行模式的,匹配失败,原因刚才也说了,接下来咱们选择多行模式进行匹配:
重要的事情说三遍:多行模式下^和$的含义会被改变,普通的含义是匹配整个字符串的开头和结尾,在多行模式下匹配的就是每一行的行首和行尾
三、不区分大小写模式
关键字:i
描述:这个很好理解,就是当你使用了不区分大小写模式匹配的时候,不论是大写还是小写都会匹配到
$text = 'The';preg_match('/^the$/', $text, $match);var_dump($match);# 返回的结果是:array(0){}
接下来使用关键字进行匹配:
$text = 'The';preg_match('/^the$/i', $text, $match);var_dump($match);# 返回的结果是: //array(1) { // [0]=> // string(3) "The" //}
四、总结:
模式 | 定义 | 关键字 |
单行模式 | (.)点号不匹配换行符,在windows中与[^\r\n]等价,并不是刻意匹配任意字符,在单行模式下会改变点号的含义,做到匹配任意字符 | s |
多行模式 | 多行模式下^和$的含义会被改变,普通的含义是匹配整个字符串的开头和结尾,在多行模式下匹配的就是每一行的行首和行尾,而\A和\Z他们的含义始终是匹配整个字符串的开头和结尾 | m |
不区分大小写模式 | 指定不区分大小写的匹配。 |
在处理python爬到的关键词时候,经常会遇到有的url前、后缀残留的情况,像这样:horizontal stones mill denmark 2018-10-21;
或是这样:7591 stone vs metal wheat grinder 。这时候,就需要正则表达式来把这些关键词处理一下。
去掉行前面的空格:^\s*;
去掉行后面的空格:\s*$;
这里需要注意,虽然^和$用法差不多,但是它们出现在表达式中的位置是不一样的。其中,^和$分别表示以后面的规则开头和以前面的规则结尾,所以^出现在表达式的前面,$出现在表达式的后面。
通过这次使用正则表达式处理关键词,终于把以前多次学习过的正则表达式知识用上了,感觉满满的满足感,学到的知识派上用场还是让人高兴的。
其实,在处理关键词过程中还需要用到一些别的正则表达式,但是不像这两个这么通用、有代表性,在这里我就不列举了。给小伙伴们推荐一下正则表达式在线测试工具。通过这种即时输入即时显示的工具确实能够极大地帮助我们加深对正则表达式的理解,多用几次自然就熟悉它的用法了。
<url>\n.*\/control\/.*.*\n.*\n.*\n.*\n.*</url>
加上了去掉行前的空格,去掉行后的空格:
^\s*<url>\s(.*)/manager/.*\s.*\s.*\s.*\s.*</url>\s*$