【问题标题】:Parsing quotes and double quotes issue in iOS在 iOS 中解析引号和双引号问题
【发布时间】:2017-11-18 01:21:28
【问题描述】:

我有一个可以接受任何输入的文本视图,我需要将引号和双引号分别解析为'"。所以如果我在我的文本视图中输入一个文本,比如“Just testin'g quotes”,输出应该是"Just testin'g quotes" 下面是我的解析代码,到目前为止它工作正常。

-(NSString *)parseQuotes:(NSMutableString *)str {
    [str replaceOccurrencesOfString:@"\"" withString:@""" options:0 range:NSMakeRange(0, [str length])];
    [str replaceOccurrencesOfString:@"'" withString:@"'" options:0 range:NSMakeRange(0, [str length])];

    return str;
}

所以,现在我的问题是,如果我要复制粘贴如下文本

“只是测试报价”

“只是测试引号”

它给了我这样的输出

“Just testin’g quotes” 

"Just testin'g quotes"

请注意第一个没有解析,因为它具有不同格式的引号和双引号。因此,为此我需要使用这些新引号复制相同的代码,例如

    [str replaceOccurrencesOfString:@"“" withString:@""" options:0 range:NSMakeRange(0, [str length])];

    [str replaceOccurrencesOfString:@"”" withString:@""" options:0 range:NSMakeRange(0, [str length])];

    [str replaceOccurrencesOfString:@"’" withString:@"'" options:0 range:NSMakeRange(0, [str length])];

这可行,但我需要知道这是否是正确的继续方式?是否有可能出现不同类型的引用并破坏此代码?是否有更好的替代解决方案适用于所有类型的报价?

【问题讨论】:

  • 您需要用" 之类的东西替换引号,这可能是因为某些要求。不同的要求会给您需要替换的不同引号集(您不会替换所有可能的 UTF 字符表中的所有类型的引号,对吧?)。您的案例有什么要求?
  • @AndrewTomenko,基本上用户可以在文本视图中键入或粘贴任何类型的内容。所以,我需要处理他们可以粘贴的任何类型的报价。
  • @Gamerlegend 用户可以粘贴非常广泛的可能称为引号的字符。但从开发的角度来看,一般不需要全部处理。例如,如果您要将用户输入存储在 xml 中并且需要转义引号 - 您只需要转义其中一个版本,它是 " 字符。

标签: objective-c parsing ios9 double-quotes xcode8


【解决方案1】:

虽然潜在替代品的集合可能会发生变化,但处理这种情况的一个好方法是使用 componentsSeparatedByCharactersInSet: Here's a good resource 来处理潜在替代品。

static NSCharacterSet *characterSet = [NSCharacterSet
    characterSetWithCharactersInString:@"\"''ʺ˝ˮ˶״᳓“”‟″‶〃""];
NSString *newStr = [[str componentsSeparatedByCharactersInSet:characterSet] componentsJoinedByString:@"""]

【讨论】:

  • 单引号需要替换为'
【解决方案2】:

首先定义一个映射:

NSMutableDictionary *mapping = [NSMutableDictionary dictionary];
mapping[@"\""] = @""";
mapping[@"”"] = @""";
...

for (NSString *key in mapping) {
    [str replaceOccurrencesOfString:key withString:mapping[key] options:0 range:NSMakeRange(0, [str length])];
}

这是一个易于扩展的解决方案。

您可能只想迭代字符并分别检查每个字符,而不是使用replaceOccurrencesOfString:withString:,以提高性能。

【讨论】:

  • 不可变字符串也会更快,但似乎这种情况下的应用程序正在处理用户输入,足够小以至于任何合理的东西都可以实时运行。
  • @danh 如今,即使是长文本也可以快速完成。这完全取决于数量或替代品。
  • 这还取决于您是否要替换字符序列,例如3 个文字点到 &hellip.
猜你喜欢
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多