簡體   English   中英

NSString正則表達式查找和替換

[英]NSString regular expression find and replace

構建一個需要在UIWebView對象中顯示一些HTML字符串的iOS應用。 我正在嘗試搜索,查找圖案,並替換為指向圖像的正確鏈接。 圖片鏈接是原始的[pic:brand:123]類的[pic:brand:123] ,其中pic始終是picbrand可以是任何字母數字,而123也可以是任何非空白字母數字。

到目前為止,我已經嘗試了一些方法,包括:

NSString *pattern = @"\\[pic:([^\\s:\\]]+):([^\\]])\\]";

但是到目前為止,沒有一個工作。

這是一個示例代碼:

NSString *str = @"veryLongHTMLSTRING";
NSLog(@"Original test: %@",[str substringToIndex:500]);
NSError *error = nil;
// use regular expression to replace the emoji
NSRegularExpression *regex = [NSRegularExpression
                                  regularExpressionWithPattern:@"\\[pic:([^\\s:\\]]+):([^\\]])\\]"
                                  options:NSRegularExpressionCaseInsensitive error:&error];
if(error != nil){
    NSLog(@"ERror: %@",error);
}else{
    [regex stringByReplacingMatchesInString:str
                                    options:0
                                      range:NSMakeRange(0, [str length])
                               withTemplate:[NSString stringWithFormat:@"/%@/photo/%@.gif",
                                             IMAGE_BASE_URL, @"$1/$2"]];

NSLog(@"Replaced test: %@",[str substringToIndex:500]);

我看到兩個錯誤:正則表達式模式的第二個捕獲組中沒有+ ,應該是

NSString *pattern = @"\\[pic:([^\\s:\\]]+):([^\\]]+)\\]";

並且stringByReplacingMatchesInString返回一個新字符串 ,它不會替換匹配的字符串。 因此,您必須將結果分配給新字符串,或者將NSMutableStringreplaceMatchesInString:options:range:withTemplate:一起使用。

以下修改后的代碼

NSString *pattern = @"\\[pic:([^\\s:\\]]+):([^\\]]+)\\]";
NSString *str = @"bla bla [pic:brand:123] bla bla";
NSLog(@"Original test: %@",str);
NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression
                              regularExpressionWithPattern:pattern
                              options:NSRegularExpressionCaseInsensitive error:&error];
if(error != nil){
    NSLog(@"ERror: %@",error);
} else{
    NSString *replaced = [regex stringByReplacingMatchesInString:str
                                    options:0
                                      range:NSMakeRange(0, [str length])
                               withTemplate:[NSString stringWithFormat:@"/%@/photo/%@.gif",
                                             @"IMAGE_BASE_URL", @"$1/$2"]];

    NSLog(@"Replaced test: %@",replaced);
}

產生輸出

Original test: bla bla [pic:brand:123] bla bla
Replaced test: bla bla /IMAGE_BASE_URL/photo/brand/123.gif bla bla

您誤解了模板的形成方式。 另外, stringByReplacingMatchesInString不會更改原始字符串。 試試這個(經過測試):

NSString *target = @"longHTML [pic:whatever:123] longHTMLcontinues";
NSMutableString *s = [target mutableCopy];

NSError *err = nil;
NSRegularExpression *expr = [NSRegularExpression regularExpressionWithPattern:@"\\[pic\\:([a-zA-Z0-9]*)\\:([a-zA-Z0-9]*)\\]" options:0 error:&err];
if (err) {
    NSLog(@"%@", err);
    exit(-1);
}

[expr replaceMatchesInString:s options:0 range:NSMakeRange(0, s.length) withTemplate:@"/photo/$1/$2.gif"];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM