Iphone 标记文本解析器,如stackoverflow';Objective-C中的s格式化程序

Iphone 标记文本解析器,如stackoverflow';Objective-C中的s格式化程序,iphone,markup,Iphone,Markup,我正在Objective C中创建标记编辑器。我需要以下功能: 识别块的分界,例如**块** 删除开始和结束“标记”,例如“下一个文本为**粗体**”变为“下一个文本为粗体” 确定新上下文中标记文本的开始和结束位置:“下一个文本为粗体” 编辑: 由于我将来可能会扩展语法(目前将非常有限),因此解析必须是自上而下的,以便文本的开始和结束位置始终与生成的文本相对应。因此,正则表达式可能不是最好的解决方案 做这件事的最佳方法是什么?最后,我们使用 下面的代码没有经过完全测试,但确实适用于St3fa

我正在Objective C中创建标记编辑器。我需要以下功能:

  • 识别块的分界,例如
    **块**
  • 删除开始和结束“标记”,例如“下一个文本为
    **粗体**
    ”变为“下一个文本为粗体”
  • 确定新上下文中标记文本的开始和结束位置:“下一个文本为粗体”
编辑: 由于我将来可能会扩展语法(目前将非常有限),因此解析必须是自上而下的,以便文本的开始和结束位置始终与生成的文本相对应。因此,正则表达式可能不是最好的解决方案


做这件事的最佳方法是什么?

最后,我们使用

下面的代码没有经过完全测试,但确实适用于St3fan指出的情况

- (NSArray *) scanContent:(NSMutableString **)content {
    NSMutableArray *tokens = [[NSMutableArray alloc] init];

    NSArray *captureRegex = [[NSArray alloc] initWithObjects:
                             @"\\[\\[(.*?)\\]\\]",@"\\*\\*(.*?)\\*\\*", nil];

    NSArray *tokenID = [[NSArray alloc] initWithObjects:
                        @"Italic",@"Bold", nil];

    int index = 0;

    for (NSString*capture in captureRegex) {

        NSRange captureRange;
        NSRange stringRange;
        stringRange.location = 0;
        stringRange.length = [*content length];

        do {
            captureRange = [*content rangeOfRegex:capture inRange:stringRange];
            if ( captureRange.location != NSNotFound ) {

                NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
                [dictionary setObject:[tokenID objectAtIndex:index] forKey:@"Token"];

                [dictionary setObject:[NSNumber numberWithInt:captureRange.location]
                               forKey:@"Start"];
                [dictionary setObject:[NSNumber numberWithInt:captureRange.length]
                               forKey:@"Length"];

                [tokens addObject:dictionary];

                for (NSMutableDictionary *dict in tokens) {
                    NSNumber *nRange = [dict objectForKey:@"Start"];
                    int start = [nRange intValue];

                    if (start > captureRange.location) {
                        nRange = [NSNumber numberWithInt:start - 4]; // Removing 4 characters 
                        [dict setObject:nRange forKey:@"Start"];
                    }

                    if (start == captureRange.location) {
                        NSString *data = [*content stringByMatching:capture options:RKLMultiline inRange:captureRange capture:1 error:NULL];                
                        NSLog(@"data: %@",data);
                        [*content replaceOccurrencesOfRegex:capture withString:data range:captureRange];
                        NSLog(@"Replaced Content: %@",*content);
                    }
                }

                stringRange.location = captureRange.location + captureRange.length -4;
                stringRange.length = [*content length] - stringRange.location;
            }
        }
        while ( captureRange.location != NSNotFound );

        index++;
    }
    return tokens;
}

StackExchange网站上使用的降价处理器MarkDown Sharp是。看一看,也许你可以看到他们是如何做到的,或者把它移植到objective-c

也许更好的是,看看这个问题:


它链接到一个名为的开源应用程序,该应用程序使用了一个名为折扣的降价C实现,还为它提供了一个objective-C包装器。

为什么您认为正则表达式不是正确的解决方案?在我看来,创建一个工作良好的格式解析器就像是“唯一的解决方案”。您可以使用一些关于bb代码的示例代码来创建wiki变体。给你一个小例子:text:*bold**,regex:\*\*([^\*]+)\*\*,结果是$1=bold。我想你是对的。我在想,如果我匹配一个粗体块,然后再匹配一个斜体块,那么我的索引就错了,但是我可以根据起始位置减去字符的差异。你当然不需要正则表达式来做这件事。您还可以使用ANTLR或Bison之类的工具来实现此目的。它很快就变得复杂起来,您如何用正则表达式解析
**3*5**
?(在此有效)基于Blaenk的代码