有時需要修改特定的字符赶么,但是手動一個個修改太麻煩,而且你不知道他們在哪里替久。如果只是“xxx”改成“yyy”凉泄,那么很簡單,直接改就可以了蚯根。但是如是比較復(fù)雜的后众,就得使用正則匹配了。比如:
NSString *path = [NSString stringWithFormat:@"%@_%@",homeDir,file];
現(xiàn)在有100條這個的代碼颅拦,現(xiàn)在要把拼接字符從"_"改成"::"蒂誉。
那么使用xcode的替換功能,首先把模式改成替換+正則:
單文件和多文件替換都有正則模式距帅。
例如上面的例子右锨,正則可以使用\[NSString stringWithFormat:@"%@(.*)%@"
,替換文字為:[NSString stringWithFormat:@"%@::%@"
使用 $1
上面的例子簡單在于碌秸,目標(biāo)的字符樣式是確定的绍移,而有些時候,目標(biāo)類型卻是跟隨替換字符變化的讥电。
比如接口的頭文件蹂窖,一開始是這樣定義的:
#define host @"https://xxx"
#define login @"/login"
#define register @"/register"
即每個接口只有后半部分,并沒有和主地址拼接成為真正有效的URL,這樣使用接口的時候恩敌,每次都得做拼接的操作瞬测,所以我希望在每個接口是已經(jīng)和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內(nèi)容部分是不一樣的抗碰,它是需要從你匹配的字符里面去獲取的狮斗。
所以其實$1
和$2
的意思已經(jīng)很明顯了绽乔,就是被匹配到的字符串里面的被匹配子串弧蝇。那哪些是子串,我測試的結(jié)果折砸,就是放在括號里的那些看疗,有沒有其他寫法我不知道,但括號里的匹配為一個子串是可以確定的睦授。因為正則里使用了2個括號两芳,所以第一個就是$1
,第二個就是$2
去枷。
對#define login @"/login"
怖辆,第一個子串匹配為.*
即是复,任何字符任何長度,匹配login
,所以$1
就是login
竖螃。同樣的淑廊,$2
就是/login
。
用好這個特咆,批量改代碼就不再那么頭痛了季惩,特別是接手項目整改的時候-_-