NSRegularExpression修改正则表达式组(回调)

时间:2013-04-10 04:14:02

标签: objective-c regex regex-group

我需要转换以下两种格式之一的文字:

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

各自的html格式:

<span name="anyText~number">anyText</span><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>";),这样我就可以实现我的目标。

2 个答案:

答案 0 :(得分:0)

试试这个正则表达式:

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

并替换为:

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

说明:

  

\w 的   匹配任何单词字符。

     

\d 的   匹配任何十进制数字。

     

+ 匹配上一个元素一次或多次。

     

(subexpression) 的   捕获匹配的子表达式并为其指定从零开始的序数。

答案 1 :(得分: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>