首页 > 技术文章 > 正则在匹配字符串时的注意事项

hxh88 2016-10-14 20:20 原文

一、正则表达式:

  用于字符串处理的一套完整的规则,字符串处理是比较常见的处理,在文本中,我们需要查找自己需要的字符,有时需要替换、删除的等等,有关正则表达式的规则。可以自己学习,这里记一下我的用法的心得

1、精通正则表达式的所有规则

  正则的规则,很庞大,支持的语言也很多,Java、C#、Python都有很好的支持,所以在写规则之前,尽量读懂所有的规则,这样子用起来会很方便,会有很多简单的规则,学得越深,对规则的运用就越熟练。

2、写规则注意要完整

  有次我自己写的爬虫,采集一些数据信息,结果发现采集到了多余的数据,发现没有注意到标签的结束位置,也就是规则不完整,害得我又重新进行了一遍整理,比如我需要采集的数据来源是txt,用户名通过txt逐行读取,然后匹配的时候,我没有注意一个问题,string uid,这个我直接在txt都到了,然后采集匹配的时候呢,我就用了string p="href=\"(httP.+?)\"username="+uid,结果发现怎么回事呢,一些用户名是admin,结果我把admin123,也采集下来了,原因很简单,就是他们的前面,都是符合的规则的,其实我当时只要后后面加个结束标签就可以的,但是我没有,于是导致了残局的发生,后面我只好自己重新帅选一遍,如果当时就加个结束标签,就不会有那么多的问题了。

3、注意分组的巧妙运用

  分组是一个很麻烦的问题,如果没有用的字符不是在开头结尾,那就不好去除,有时候我们必须要一些中间字符,也就有了分组的概念,可以提取整个字符串中我们需要的部分,当然你也可以把括号分组去掉,这样子也是可以的。

4、做必要的预处理

  有时候你会发现,html代码中其实是一个表格形式,你要匹配的内容,很巧合的就在表格里面,但是表格中的格式控制符号会很长,直接写正则的话,你会发现很乱很麻烦,包括一些引号,你还要必须进行转义,于是就有了预处理,如果你要求的效率不是特别高,那为什么不尝试一下,先将表格的标签都进行正则的替换呢<td.+?</td>可以先替换为@#等等,接下来你的正则规则写起来就会简单很多了,也会方便很多,因为你可以不用管哪些复杂的标签文本。

5、注意转义字符

  很多时候,转义很重要,初学者也很难理解这个问题,在Java里面没有原生字符,需要两次转义更是让人脑洞大开,我当初也是翻滚过啊,那段人生真是不堪回首。C#和Python都是有原生字符串的,这个一次转义就让人很容易地明白了。我要特别提示的是,在写正则的时候,有些时候,我们的规则可能与用户的输入有关系,比如你的产品型号是通过txt读取的,然后你的规则里很巧合地需要在产品名用于匹配,于是很有可能你会直接  string name=读取自txt;  string p="getname="+name;  于是,问题来了,当你欣喜地打开数据库看,你会发现自己的结果里面居然会有一些数据产品名字相近但不是自己想要的,这个时候就是你没有注意到转义的问题了,产品名字中很有可能就会有诸如"+*.{}[]"等等,需要转义的字符了,这个时候我们需要先分析我们的产品名字,把可能会出现的转义字符都进行一次替换,也就是前面价格转义字符.   name=name.repalceAll("+","\+");  有时候可能还要注意先后顺序,如果产品中本身就有"\",就更加复杂了,还有替换的先后顺序也很重要!

推荐阅读