有时需要修改特定的字符,但是手动一个个修改太麻烦,而且你不知道他们在哪里。如果只是“xxx”改成“yyy”,那么很简单,直接改就可以了。但是如是比较复杂的,就得使用正则匹配了。比如:
NSString *path = [NSString stringWithFormat:@"%@_%@",homeDir,file];
现在有100条这个的代码,现在要把拼接字符从"_"改成"::"。
那么使用xcode的替换功能,首先把模式改成替换+正则:
单文件替换多文件替换
单文件和多文件替换都有正则模式。
例如上面的例子,正则可以使用\[NSString stringWithFormat:@"%@(.*)%@"
,替换文字为:[NSString stringWithFormat:@"%@::%@"
使用 $1
上面的例子简单在于,目标的字符样式是确定的,而有些时候,目标类型却是跟随替换字符变化的。
比如接口的头文件,一开始是这样定义的:
#define host @"https://xxx"
#define login @"/login"
#define register @"/register"
即每个接口只有后半部分,并没有和主地址拼接成为真正有效的URL,这样使用接口的时候,每次都得做拼接的操作,所以我希望在每个接口是已经和host拼接过的,也就是变成:
#define host @"https://xxx"
#define login [host stringByAppendingString:@"/login"]
#define register [host stringByAppendingString:@"/register"]
这时候正则怎么写?
- 正则:
#define (.*)@"(.*)"$
- 替换字符:
#define $1[host stringByAppendingString:@"$2"]
难点在于,对于每个接口,[host stringByAppendingString:xxx
里面的xxx内容部分是不一样的,它是需要从你匹配的字符里面去获取的。
所以其实$1
和$2
的意思已经很明显了,就是被匹配到的字符串里面的被匹配子串。那哪些是子串,我测试的结果,就是放在括号里的那些,有没有其他写法我不知道,但括号里的匹配为一个子串是可以确定的。因为正则里使用了2个括号,所以第一个就是$1
,第二个就是$2
。
对#define login @"/login"
,第一个子串匹配为.*
即,任何字符任何长度,匹配login
,所以$1
就是login
。同样的,$2
就是/login
。
用好这个,批量改代码就不再那么头痛了,特别是接手项目整改的时候-_-
网友评论