Vim Regex:如何搜索NOT A和B

时间:2015-08-20 14:30:27

标签: regex vim substitution

我是正则表达式的新手。我希望找到不包含A的行,然后包含B,然后屏蔽B。

我的目标是日志文件中的信用卡号码,匹配行不包含“xxx”。

信用卡模式 16位数字以3,4,5或6开头,分别为“ - ”,空格或空格,限制为空格,“,”,“'”或“”“如下所示。

3214745869874125/3214 7458 6987 4125 / 3214-7458-6987-4125

4214745869874125/4214 7458 6987 4125 / 4214-7458-6987-4125

5214745869874125/5214 7458 6987 4125 / 5214-7458-6987-4125

6214745869874125/6214 7458 6987 4125 / 6214-7458-6987-4125

3214745869874125 /“3214745869874125”/'3214745869874125'/,3214745869874125,

我写了一些东西来寻找卡号和掩码。这有效,但我需要匹配不包含“xxx”的行 这可以转换

for(int i=0;i<2000;++i)
System.gc();

到这个

321474 ****** 4125/3214 74 ** **** 4125 / 3214-74 ** - **** - 4125

421474 ****** 4125/4214 74 ** **** 4125 / 4214-74 ** - **** - 4125

521474 ****** 4125/5214 74 ** **** 4125 / 5214-74 ** - **** - 4125

621474 ****** 4125/6214 74 ** **** 4125 / 6214-74 ** - **** - 4125

321474 ****** 4125 /“321474 ****** 4125”/'321474 ****** 4125'/,321474 ****** 4125,

我看着\&amp;但无法利用它。我试过这个,

%s/\([ ,'"][3456]\d\{3}[- ]\?\d\{2}\)\d\{2}\([- ]\?\)\d\{4}\([- ]\?\d\{4}[ ,'"]\)/\1**\2****\3/gc

此,

%s/\(101011\)\&\([ ,'”][3456]\d\{3}[- ]\?\d\{2}\)\d\{2}\([- ]\?\)\d\{4}\([- ]\?\d\{4}[ ,'”]\)/\1**\2****\3/gc

这个,

%s/101011\&\([ ,'”][3456]\d\{3}[- ]\?\d\{2}\)\d\{2}\([- ]\?\)\d\{4}\([- ]\?\d\{4}[ ,'”]\)/\1**\2****\3/gc

解决

我这样解决了,

%s/\(.*101011\)\&\([ ,'"][3456]\d\{3}[- ]\?\d\{2}\)\d\{2}\([- ]\?\)\d\{4}\([- ]\?\d\{4}[ ,'"]\)/\1**\2****\3/gc

2 个答案:

答案 0 :(得分:1)

你的问题不明确。您可能已经解决了几个小时的问题,但您应该考虑到这里的人正在阅读您的问题,不知道什么是要求,什么是信用卡模式等。

你应该清楚自己。即使你在评论中加上一个例子,也不清楚。无论如何,对于你的例子,下面的行有效。

关键是,您可以使用\zs \ze来设置替换的边框。

   %s/\v.*"\d{4}[- ]\zs\d{4}([- ])\d\d\ze\d\d[- ]\d{4}".*/****\1**/

这一行改变:

aaa, "4125 2636 4785 1231"

aaa, "4125 **** **85 1231"

分隔符可以是SPACE or -

答案 1 :(得分:1)

最新的Vim包括logipat plugin。所以你可以使用命令 Novacode-dox搜索与模式A不匹配的行和匹配模式B