从这一节开始,开始涉及到正则表达式的一些高级用法,前面只是一些基础知识是基本块,构成了接下来的这些高级的使用方法。简单来讲,子表达式就是使用括号包裹起来的正则表达式而已。而本章的子表达式在后面的一致性、回溯查找,前后查找,嵌入条件和替换当中都将发挥重要作用。
那么现在我们来学习下这个重要子表达式概念。假设我们需要查找到正确的ip地址信息,而不是非法的。那么按照一般写法就是以下这样:
- ([\d]{1,3}\.){3}([\d]{1,3})
这其中,包含了2个括号,就是2个子表达式。([\d]{1,3}\.)和([\d]{1,3})当然,仔细来看,这个表达式是存在问题的。比如Ip地址的数字是0-255范围内,而上面这个表达式明显已经是可以匹配到255以上的数字,甚至可以匹配到999.这当然是不正确的。如果稍微改良一下应该就可以满足我们的要求。
第一步我们需要做的是,找到一个表达式可以匹配到0-255,这个看上去并不难,稍作思考得出如下正则表达式。思路是1位、2位、或者3位ip地址:
(((1[\d]{2})|([\d])|([1-9][\d])|(25[0-5])|(2[0-4][\d]))\\.){3}
最后一个数字是0-255,不需要匹配. ,所以最终的表达式是这样的
(((1[\d]{2})|([\d])|([1-9][\d])|(25[0-5])|(2[0-4][\d]))\\.){3}(((1[\d]{2})|([1-9][\d])|([\d])|(25[0-5])|(2[0-4][\d])))
(((1[\d]{2})|([\d])|([1-9][\d])|(25[0-5])|(2[0-4][\d]))\.){3}可能有些人看上去会觉得很长,其实就是各个子表达式,各个表达式关系理清楚就好了。 文章的最后,我分享一个小技巧吧。很多人会编写SQL语句,如果遇到 那种字段比较多的数据库表,编写UPDATE 参数语句,估计也是很崩溃的事情,这里介绍一个使用子表达式的一个小技巧
假设数据库表TableA有从a-g字段,select a,b,c,d,e,f,g from TableA,那么怎么快速变成Update的参数语句呢?
最终我们想要的结果是这样的:
update tablea set
a=@a,b=@b,c=@c,d=@d,e=@e,f=@f,g=@g
where id =@id
在notepad++ 将字段复制进去,既a,b,c,d,e,f,g然后使用正则表达式,在find文本框中输入(\w+)
然后在replace文本框中输入\1=\@\1,然后全部替换,最后就得到了:
a=@a,b=@b,c=@c,d=@d,e=@e,f=@f,g=@g
再加上update where等语句,就可以很快速的完整。这里稍微解释一下,替换文本中\1用来代替第一个子表达式(当然有多个可以用\2\3等),相当于占位符,\1 =(\w+),所以最终就替换成了我们想要的样子。