【问题标题】:Remove "?" from NSString IOS消除 ”?”来自 NSString IOS
【发布时间】:2015-02-24 14:06:42
【问题描述】:

我正在尝试从字符串中删除所有符号,它适用于除“?”之外的所有符号的以下代码。

NSString *newString = self.titleString;

NSArray *characters = @[@"<", @"!", @"@", @"#", @"$", @"%", @"^", @"&", @"*", @"(", @")", @",", @"_", @"+", @"|", @">", @"?", @" "];

for (NSString *str in characters) {
    newString = [newString stringByReplacingOccurrencesOfString:str withString:@""];
}

【问题讨论】:

  • 我试过你给定的代码,即使使用 ?它正在从字符串中删除。我在您的代码中使用了以下字符串@“Hello 1234?>()?”并输出了“Hello1234”。所以请你告诉你使用哪个字符串会产生问题。

标签: ios objective-c xcode nsstring


【解决方案1】:

您可以将stringByReplacingOccurrencesOfString 与正则表达式选项NSRegularExpressionSearch 一起使用:

NSString *output = [input stringByReplacingOccurrencesOfString:@"[<>!@#$%^&*(),_+?| ]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [input length])];

您还可以利用其他正则表达式功能,例如替换所有非字母字符:

NSString *output = [input stringByReplacingOccurrencesOfString:@"\\P{L}" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [input length])];

或者不是 A-Z:

NSString *output = [input stringByReplacingOccurrencesOfString:@"[^a-zA-Z]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [input length])];

这完全取决于您想要达到的目标。

【讨论】:

    【解决方案2】:

    您可以使用NSRegularExpression 删除单个调用中的所有字符:

    NSString *string = self.titleString;
    NSError *error = nil;
    // Prepare the regular expression that matches any of your characters
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[<>!@#$%^&*(),_+?| ]"
        options:NSRegularExpressionCaseInsensitive
        error:&error];
    // Replace all matches with an empty string
    string  = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@""];
    

    【讨论】:

    • 虽然在 OP 的问题中没有明确说明,但正则表达式如何捕捉不同语言的标点符号?
    • @StephenFurlani 我不认为正则表达式可以做到这一点:即使是 POSIX [:punct:] 也有一组预定义的字符。
    • 如果要匹配标点符号,则为\\p{P}。但这不会涵盖许多 OP 的字符(例如货币符号),\\p{S} 将涵盖这些字符。然后是空格,使用\\s\\p{Z}。坦率地说,在这些情况下,从另一个方向接近通常更安全,即允许使用哪些符号(例如 [^a-zA-Z]\\P{L})。
    【解决方案3】:

    你必须像这样转义?:“\?”。否则将无法正常工作。 ? 仅表示在正则表达式中代表 0 或 1 次出现,因此您必须对 Objective-c 说它是您要测试的真实字符。

    【讨论】:

      【解决方案4】:

      如果这是为了编辑用户文本,您可能需要考虑使用多个 NSCharacterSet 的联合 - 这将有助于在您本地化/国际化您的应用时使其更加语言友好。

      NSString *myInputText = @"asd;jkfhals@$%^%$&1asldiguhd";
      NSCharacterSet *nonAlphanumeric = [[NSMutableCharacterSet alphanumericCharacterSet] invert];
      NSArray *parts = [myInputText componentsSeparatedByCharactersInSet:nonAlphanumeric];
      NSArray *mySafeOutputText = [parts componentsJoinedByString:@""];
      

      使用components 方法有点不直观,但不幸的是Apple 没有提供stringByReplacingCharactersInSet: 方法。 :(

      【讨论】:

        猜你喜欢
        • 2014-11-25
        • 1970-01-01
        • 1970-01-01
        • 2011-10-13
        • 1970-01-01
        • 2012-02-10
        • 1970-01-01
        相关资源
        最近更新 更多