【问题标题】:Replace only single occurrence of \n or \r in NSString仅替换 NSString 中出现的 \n 或 \r
【发布时间】:2015-05-06 12:56:39
【问题描述】:

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

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

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

【问题讨论】:

  • 我认为您需要编写自己的方法来检查是否多次出现 \n 或 \r 并做出相应的反应
  • stackoverflow.com/questions/8608346/… 这可能会有所帮助
  • 您能否向我们展示您正在处理的内容的文本摘录,以及结果应该是什么?
  • 我想替换一次出现的\n。例如:h\n e\n l\n l\n o\n \n \n \n w\n o\n r\n l\n d 应该显示为 hello 和 world,但是 hello 和 world 之间的行数应该保持不变(在这种情况3)你好\n\n\n世界

标签: ios objective-c cocoa pdftotext


【解决方案1】:

有两种方法:

  1. 在循环中手动查找

您可以使用-rangeOfCharactersFromSet:options:range: 获取字符串的范围。这种方法的妙处是减少每个找到的匹配项的搜索范围。这样做您可以简单地将找到的范围与搜索范围进行比较。如果找到的范围在最开始,则它是双倍(或三倍)\r

  1. 获取各个组件

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

【讨论】:

    【解决方案2】:

    您应该使用NSRegularExpression 来执行此操作

    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"];
    

    【讨论】:

    • 我想替换一次出现的\n。例如:h\n e\n l\n l\n o\n \n \n \n w\n o\n r\n l\n d 应该显示为 hello 和 world,但是 hello 和 world 之间的行数应该保持不变(在这种情况3)你好\n\n\n世界
    • 然后修改正则表达式以仅查找 \n 的一个实例(即,不超过一个连续实例),因此只有那些被替换/删除。例子比比皆是。
    【解决方案3】:

    你试过正则表达式吗? 您只能捕获 \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:@""];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 2011-01-28
      相关资源
      最近更新 更多