正则表达式抓捕替换

问题情境

需要将RDL报表里的GetComment( Parameters!F0001.Value , Parameters!F0002.Value ,"total", Parameters!Language.Value)函数修改为GetCommentForComment( Parameters!F0001.Value , Parameters!F0002.Value ,"total", Parameters!Language.Value, "ReportConnection0107")。

思路

使用正则表达式里面的分组进行抓获,再用1将中间固定的参数取出,组成新的字符串。

Vim实现

%s/GetComment(((sw+!w+.w+s,){2}s"w+"s,sw+!w+.w+s))/GetCommentForReport(1 , "ReportConnection0107")/gc

解释 …

more ...

正则表达式中的零宽断言

这文是上个月开始写的,本来想深入的分析一下零宽断言,可惜工作一直忙,现在又要去转战DWR...OMG~~

起因

将要上线的系统中有一个字符规则:"13位的字符串,其中有8位连续数字",需要用这则表达式对这个字符串进行判断。而我之前对正则的认识仅仅停留在匹配固定的字符上 ,对这个问题一筹莫展。

这时候热心的小邪出现了,我在他的博客 邪罗刹的菠萝阁 留下这个问题

image

小邪很热心的撰写了一篇文章给出回答: 一个杯具和一个洗具与最近学习手记 : 邪罗刹的菠萝阁

解答

核心字符串如下: '/^(?!(.?d){9,})(?!(.?D){6,}).{13}$/';

小邪的文章给了很详细的解答,比我自己解释要好得多~我就索性copy过来,如下:

小邪是这个样子解答的,首先两边的斜杠是 Perl 正则式的要求。

然后两边的 ^ 和 $ 用来表示对应的是字符串的开始和结束。

接着.{13},. 表示除了换行以外的所有字符,13 规定了匹配长度。

我们这里前面用了两次零宽断言,第一次,(?!exp)这里的 exp 是 …

more ...