Ios 仅替换NSString中\n或\r的单个匹配项

Ios 仅替换NSString中\n或\r的单个匹配项,ios,objective-c,cocoa,pdftotext,Ios,Objective C,Cocoa,Pdftotext,我正在阅读从PDF到NSString的文本。我使用下面的代码替换所有空格 NSString *pdfString = convertPDF(path); pdfString=[pdfString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; pdfString=[pdfString stringByReplacingOccurrencesOfString:@"

我正在阅读从PDF到NSString的文本。我使用下面的代码替换所有空格

NSString *pdfString = convertPDF(path);
    pdfString=[pdfString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    pdfString=[pdfString stringByReplacingOccurrencesOfString:@"\r" withString:@""];
    pdfString=[pdfString stringByReplacingOccurrencesOfString:@"\n" withString:@""];

但这也消除了段落空间和多行。我只想替换一次出现的\n或\r,并保留段落空格或多个制表符和下一行。

有两种方法:

  • 在循环中进行手动查找
  • 您可以使用
    -rangeOfCharactersFromSet:options:range:
    获取字符串的范围。这种方法的精髓是减少每次找到匹配的搜索范围。这样做,您只需将找到的范围与搜索范围进行比较。如果找到的范围在最开始时,则它是一个双(或三重)
    \r

  • 获取各个组件
  • 使用
    -componentsSeparatedByCharactersFromSet:
    NSString
    )返回一个数组,其中字符串以
    \r
    分隔。此数组中的空字符串是双字符串(或三字符串)
    \r
    。只需用
    \r
    替换它们,然后用空格重新连接组件。

    您应该使用

    NSString *pdfString = convertPDF(path);
    
    //Replace all occurrences of \n by a single \n
    NSRegularExpression *regexN = [NSRegularExpression regularExpressionWithPattern:@"\n" options:0 error:NULL];
    pdfString = [regexN stringByReplacingMatchesInString:pdfString options:0 range:NSMakeRange(0, [pdfString length]) withTemplate:@"\n"];
    
    //Replace all occurrences of \r by a single \r
    NSRegularExpression *regexR = [NSRegularExpression regularExpressionWithPattern:@"\r" options:0 error:NULL];
    pdfString = [regexR stringByReplacingMatchesInString:pdfString options:0 range:NSMakeRange(0, [pdfString length]) withTemplate:@"\r"];
    
    你试过regex吗? 您只能捕获一个
    \n
    单独出现而没有另一个
    \n
    的事件,然后用空字符串替换这些事件:

    NSError *error = nil;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^\n]([\n])[^\n];" options:0 error:&error];
    NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@""];
    

    我认为您需要编写自己的方法来检查\n或\r是否多次出现,并作出相应的反应。这可能会有帮助。您可以向我们显示您正在处理的内容的文本摘录,以及结果应该是什么吗?我想在单次出现\n时替换。例如:h\n e\n l\n l\n o\n\n w\n o\n r\n l\n d应显示为hello和world,但hello和world之间的行数应保持不变(在本例中为3)hello\n\n world我希望在出现一次时替换\n。例如:h\n e\n l\n l\n o\n\n w\n o\n r\n l\n d应显示为hello和world,但hello和world之间的行数应保持不变(在本例中为3)hello\n\n world然后修改正则表达式以仅查找\n的一个实例(即,不超过一个连续实例),以便仅替换/删除这些实例。例子不胜枚举。