花了半天时间看完了一本入门书,发现正则表达式还是挺有意思的。
一般来说,计算机处理的是数值计算问题,差不多就是算术,在算术的基础上实现可视化,数据图形对应,由此获得各种计算机辅助设计的东西。不过,计算机还有一个重要的工作就是字符串处理,或者说文本处理,正则表达式就是进行文本处理的利器。
文本处理一般来说,就是标记,查找与替换,就像阅读文章,或者改作文一样,从长篇的内容中提取出来感兴趣的内容,或者总结出一些关键词,将一些不合适的表达标记出来,然后替换为合适的表达。其中,查找是方便进行自动化的,通过给定明确的条件,就能定义出来一个合适的程序,实现所需的功能。标记和替换则往往需要人的参与,因为涉及了很多复杂而模糊的规则。
正则表达式就是用于查找的,如果把文章比作一堆谷物,正则表达式就像一个筛子,将谷物筛去一遍,留下符合要求的内容。虽然使用循环和条件结构也可以实现同样的功能,但是业务逻辑就会非常复杂,变成一个庞然大物。正则表达式可以说就是对这样的复杂的实现进行抽象,获得良好的接口,于是只需要简单的几个符号就能实现复杂的字符串匹配逻辑。
举几个例子:
纯字符串型
cat,也就是匹配所有的cat字段,比如cats,catball,bicat中的cat,可以看到这种匹配并未精准到一个单词,只是单词的一部分。如果要精确匹配一个单词的话,就需要指明,\bcat\b在cat前后都加上了\b,就限制了必须是cat这个单词才是需要的,\b也称为单词边界。
字符集合
[0123456789]使用中括号括起来,就是指允许的字符,也就是0,1,2,3,4,5,6,7,8,9,整个中括号匹配单个字符,满足要求的就是单个数字,比如1pt中的1,2unit中的2。经过简化,可以写作[0-9],效果是一样的,比如常见的[a-z],[A-Z],就是经过简化的字母集合。常用的变量命名字符集合就是[0-9a-zA-Z_],包括字母数字和下划线。这个集合还可以简写为\w,所以匹配任意的连续三个命名字符就写作\w\w\w。然后我们就发现似乎有些麻烦,需要重复写很多次,如果需要长度很长的匹配字符串的话,就很容易出错,所以可以通过另外的符号指定次数
\w{10}就是指十个任意命名字符。对于次数要求不那么严格的,还有各种简写。
重复字符串
\w+是指重复一次或者多次,比如1,11,111,1111,...都符合条件。
@\w*是指重复零次或多次,为了体现零次,前面加了一个非命名字符,那么@,@1,@11,...都符合条件。
#\w?是指重复零次或一次,这个的话满足条件的就比较少了,比如#,#1,#a,#_都符合条件。
这就是三个简化符号,+,*,?
发现一个大问题,在markdown中*也是特殊符号,需要进行转义,不然会导致各种排版问题,转义就是在符号前加上反斜杠\,\*。
具体的内容还有很多
比如贪婪*和懒惰*?,比如子表达式(abc)和回溯引用\1,\2,还有单词边界\b,非单词边界\B,还有取非[^0-9],消费不消费,向前查找,向后查找。
发现忘了很多了,也很正常,复杂的一般用不上也就忘了。
网友评论