2013-04-10 45 views
1

我需要將文本轉換在以下兩種格式:NSRegularExpression修改正則表達式組(回調)

[[anyText~number]] OR [[anyText]]

到相應的HTML格式:

<span name="anyText~number">anyText</span> OR <span name="anyText">anyText</span>

例如:

[[Thanks~1]]<span name="Thanks~1">Thanks</span>

[[Hello]]<span name="Hello">Hello</span>

對於這一點,我已經創建了下面的函數中的NSString類別:

- (NSString*) stringByReplacingOccurrencesOfRegex:(NSString*)regexString withString:(NSString*)replaceWithString { 
    NSError* error; 
    NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:regexString options:NSRegularExpressionCaseInsensitive error:&error]; 
    NSRange fullrange = NSMakeRange(0,self.length); 
    return [regex stringByReplacingMatchesInString:self options:NSMatchingWithTransparentBounds range:fullrange withTemplate:replaceWithString]; 
} 

某處在我的代碼,我現在用的是以下:

regexString = @"\\[\\[([^\\]]*)\\]\\]"; 
    replaceWithString = @"<span name=\"$1\">$1</span>"; 
    rawStoryString = [rawStoryString stringByReplacingOccurrencesOfRegex:regexString withString:replaceWithString]; 

這樣的結果是<span name=\"anyText~number\">anyText~number</span>。有沒有辦法可以在$1(說removeTilderAndFurther($1),在這種情況下,我的代碼變成replaceWithString = @"<span name=\"$1\">removeTilderAndFurther($1)</span>";),以便我可以實現我所追求的。

回答

0

真是個好主意,添加一個類別來做到這一點!我能做到這一點,像這樣:

NSString *regexString = @"\\[\\[((\\w+)(~\\d+)?)\\]\\]"; 
NSString *replaceWithString = @"<span name=\"$1\">$2</span>"; 
  1. 第一種情形,沒有任何數字[[Hello]]

    NSString *rawStoryString = @"[[Hello]]"; 
    NSLog(@"rawStoryString: %@", rawStoryString); 
    rawStoryString = [rawStoryString stringByReplacingOccurrencesOfRegex:regexString withString:replaceWithString]; 
    NSLog(@"rawStoryString: %@", rawStoryString); 
    

    它的輸出是:

    rawStoryString: [[Hello]] 
    rawStoryString: <span name="Hello">Hello</span> 
    
  2. 第二種情況與代字號和號碼[[Thanks~1]]

    rawStoryString = @"[[Thanks~1]]"; 
    NSLog(@"rawStoryString: %@", rawStoryString); 
    rawStoryString = [rawStoryString stringByReplacingOccurrencesOfRegex:regexString withString:replaceWithString]; 
    NSLog(@"rawStoryString: %@", rawStoryString); 
    

    它的輸出是:

    rawStoryString: [[Thanks~1]] 
    rawStoryString: <span name="Thanks~1">Thanks</span> 
    
+0

非常感謝Jason。對不起,貪心......是否有可能在這裏引入一個變體...... $ 1變成小寫......即輸出是你好謝謝 Amarsh 2013-04-10 06:23:41

+0

@Amarsh我不認爲這可以在模式中完成。 – 2013-04-10 15:44:17

0

試試這個正則表達式:

\[\[(\w+)(~\d+)?\]\] 

,並替換爲:

<span name="$1$2">$1</span> 

解釋:

\w 匹配所有文字字符。

\d 匹配任何十進制數字。

+匹配前面的元素的一個或多個次。

(subexpression) 捕獲匹配的子表達式,併爲其分配一個從零開始的序數。

+0

感謝。只要格式爲[[anyText〜number]],它就會工作。我的一些字符串格式爲[[anyText]],在這種情況下,這個正則表達式失敗(我正在更新我的帖子來引發此)。你能否提供一個適用於這兩種情況的正則表達式? – Amarsh 2013-04-10 04:55:18

+0

我更新了我的答案 – Ria 2013-04-10 05:21:41

+0

謝謝Ria。我剛剛得到了傑森的回答,因此表明它是正確的。反正非常感謝。 – Amarsh 2013-04-10 06:19:35