今天在寫(xiě)一個(gè)項(xiàng)目的時(shí)候用到了正則表達(dá)式;將正則表達(dá)式與字典中的 key 進(jìn)行匹配,并將匹配到的字符串用 key 對(duì)應(yīng)的 value 來(lái)替換.
記得之前看到過(guò)一篇文章名字好像是"懂十句正則表達(dá)式,少寫(xiě) 1k 行代碼",好像是這個(gè)名字,記不大清了;其實(shí)一點(diǎn)不為過(guò),正則表達(dá)式確實(shí)有其方便之處;但是初一看正則表達(dá)式----數(shù)以億計(jì)只可愛(ài)的羊駝奔騰不息----有沒(méi)有????有沒(méi)有????有沒(méi)有????
當(dāng)然,這里說(shuō)笑了.正則表達(dá)式語(yǔ)法看起來(lái)好像很復(fù)雜,其實(shí)簡(jiǎn)單的使用也沒(méi)有太復(fù)雜的;其語(yǔ)法在這里不贅述了,大家可以看下這兩篇文章 文章一 文章二;
在我們 iOS 開(kāi)發(fā)中,蘋(píng)果也為我們提供了對(duì)應(yīng)的方法和類來(lái)方便我們?cè)陂_(kāi)發(fā)中使用正則表達(dá)式就是NSRegularExpression這個(gè)類;
下面是我在寫(xiě)項(xiàng)目時(shí)用到的幾個(gè)方法,寫(xiě)了一個(gè) Demo
Edit:今天在優(yōu)化代碼的時(shí)候,發(fā)現(xiàn)了一個(gè)更加簡(jiǎn)單的方法,寫(xiě)在下面,第二種方法;
--------------方法一----------------------
下面我們直接入正題:
1. 首先我們要?jiǎng)?chuàng)建一個(gè)NSRegularExpression的對(duì)象,這里系統(tǒng)提供了兩種方法,一個(gè)類方法,一個(gè)構(gòu)造方法;
+ (nullable NSRegularExpression *)regularExpressionWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;
- (nullable instancetype)initWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;
下面說(shuō)下這里面的幾個(gè)參數(shù):
- pattern:這個(gè)參數(shù)就是要匹配的正則表達(dá)式;
- options:這個(gè)參數(shù)表示匹配類型,很明顯這是一個(gè)枚舉;另外這個(gè)枚舉是一個(gè)位枚舉,可以同時(shí)啟用多個(gè),以按位或
|連接;
// 不區(qū)分大小寫(xiě)
NSRegularExpressionCaseInsensitive = 1 << 0,
// 忽略空格和# -
NSRegularExpressionAllowCommentsAndWhitespace = 1 << 1,
// 整體化
NSRegularExpressionIgnoreMetacharacters = 1 << 2,
// 匹配任何字符,包括行分隔符
NSRegularExpressionDotMatchesLineSeparators = 1 << 3,
// 允許^和$匹配開(kāi)始和結(jié)束
NSRegularExpressionAnchorsMatchLines = 1 << 4,
// 設(shè)置\\n為唯一的行分隔符,否則所有的都有效
NSRegularExpressionUseUnixLineSeparators = 1 << 5
// 使用Unicode TR#29標(biāo)準(zhǔn)作為詞的邊界,否則所有傳統(tǒng)正則表達(dá)式的詞邊界都有效
NSRegularExpressionUseUnicodeWordBoundaries = 1 << 6
- error:為錯(cuò)誤信息,可以返回錯(cuò)誤信息,如果需要抓取這個(gè)錯(cuò)誤的話可以給一個(gè) NSError 對(duì)象的地址,一般情況可以直接給一個(gè)
nil;
2. 接下來(lái)就要開(kāi)始進(jìn)行替換了,就是用下面這個(gè)方法,這個(gè)方法的返回值是一個(gè)替換完成后的字符串;
- (NSString *)stringByReplacingMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range withTemplate:(NSString *)templ;
再來(lái)說(shuō)說(shuō)這里的幾個(gè)參數(shù):
- string:需要正則表達(dá)式去匹配的字符;
- option這里也是一個(gè)枚舉,同樣這里也是一個(gè)位枚舉,同法同上樣這里我就不多寫(xiě)
// 找到最長(zhǎng)的匹配字符串后調(diào)用 block 回調(diào)
NSMatchingReportProgress = 1 << 0,
// 找到任何一個(gè)匹配串后都回調(diào)一次 block
NSMatchingReportCompletion = 1 << 1,
// 從匹配范圍的開(kāi)始進(jìn)行極限匹配
NSMatchingAnchored = 1 << 2,
// 允許匹配的范圍超出設(shè)置的范圍
NSMatchingWithTransparentBounds = 1 << 3,
// 禁止^和$自動(dòng)匹配開(kāi)始和結(jié)束
NSMatchingWithoutAnchoringBounds = 1 << 4
- range:匹配范圍,這里可以直接給一個(gè)
(0, string.length),就是在整個(gè)字符串范內(nèi)配; - templ:需要替換的字串;
3. 上面將要用到的兩個(gè)方法介紹了一下,接下來(lái)進(jìn)入主題------->上代碼:
// 準(zhǔn)備對(duì)象
NSString * searchStr = @"LOOK239832LOOK";
NSString * regExpStr = @"[0-9A-Z].";
NSString * replacement = @"ha";
// 創(chuàng)建 NSRegularExpression 對(duì)象,匹配 正則表達(dá)式
NSRegularExpression *regExp = [[NSRegularExpression alloc] initWithPattern:regExpStr
options:NSRegularExpressionCaseInsensitive
error:nil];
NSString *resultStr = searchStr;
// 替換匹配的字符串為 searchStr
resultStr = [regExp stringByReplacingMatchesInString:searchStr
options:NSMatchingReportProgress
range:NSMakeRange(0, searchStr.length)
withTemplate:replacement];
NSLog(@"\\nsearchStr = %@\\nresultStr = %@",searchStr,resultStr);
4.運(yùn)行結(jié)果

--------------方法二----------------------
今天在優(yōu)化代碼的時(shí)候,發(fā)現(xiàn)了一個(gè) NSString 的方法也是可以做這種正則表達(dá)式的匹配的,下面補(bǔ)上代碼:
// 準(zhǔn)備對(duì)象
NSString *orginalString = @",0,f,m,b";
NSString *regExpString = @",[01]";
NSString *template = @"";
for (NSInteger i = 0; i < 10; i++) {
NSString *result =
[orginalString stringByReplacingOccurrencesOfString:regExpString
withString:template
options:NSRegularExpressionSearch // 注意里要選擇這個(gè)枚舉項(xiàng),這個(gè)是用來(lái)匹配正則表達(dá)式的
range:NSMakeRange (0, orginalString.length)];
NSLog (@"\nsearchStr = %@\nresultStr = %@", orginalString, result);
}
結(jié)果也是一樣的能替換,下面來(lái)看一下:

&esmp;&esmp;這里面有一個(gè)枚舉項(xiàng),如果是用于匹配正則表達(dá)式的話,一定要選 NSRegularExpressionSearch,不然的話,就是將正則表達(dá)式以字符串的形勢(shì)去替換,而不是去匹配替換,請(qǐng)務(wù)必注意這點(diǎn);