iOS 開(kāi)發(fā)中使用正則表達(dá)式匹配并替換對(duì)應(yīng)字符

今天在寫(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é)果

result image

--------------方法二----------------------

今天在優(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)看一下:
second_mothed_result

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容