Cocoa 从NSString中删除非字母数字字符

Cocoa 从NSString中删除非字母数字字符,cocoa,cocoa-touch,nsstring,nscharacterset,Cocoa,Cocoa Touch,Nsstring,Nscharacterset,我正在寻找一种快速简便的方法,从NSString中去除非字母数字字符。可能是使用了NSCharacterSet,但我很累,似乎没有任何东西返回一个只包含字符串中字母数字字符的字符串。我最后做的是创建一个NSCharacterSet和找到的-invertdset方法(额外一小时的睡眠对文档阅读能力有何作用真是个奇迹)。下面是代码片段,假设someString是要从中删除非字母数字字符的字符串: NSCharacterSet *charactersToRemove = [[ NSCharacterS

我正在寻找一种快速简便的方法,从
NSString
中去除非字母数字字符。可能是使用了
NSCharacterSet
,但我很累,似乎没有任何东西返回一个只包含字符串中字母数字字符的字符串。

我最后做的是创建一个NSCharacterSet和找到的
-invertdset
方法(额外一小时的睡眠对文档阅读能力有何作用真是个奇迹)。下面是代码片段,假设
someString
是要从中删除非字母数字字符的字符串:

NSCharacterSet *charactersToRemove =
[[ NSCharacterSet alphanumericCharacterSet ] invertedSet ];

NSString *trimmedReplacement =
[ someString stringByTrimmingCharactersInSet:charactersToRemove ];

trimmedReplacement
随后将包含
someString
的字母数字字符。

我们可以通过拆分然后合并来完成此操作。需要OS X 10.5+用于按字符分离的组件集合:

NSCharacterSet *charactersToRemove = [[NSCharacterSet alphanumericCharacterSet] invertedSet];
NSString *strippedReplacement = [[someString componentsSeparatedByCharactersInSet:charactersToRemove] componentsJoinedByString:@""];
清理类别 我有一个方法调用
stringByStrippingCharactersInSet:
stringbycollasingwhitespace
,这可能很方便直接访问

@implementation NSString (Cleanup)

- (NSString *)clp_stringByStrippingCharactersInSet:(NSCharacterSet *)set
{
    return [[self componentsSeparatedByCharactersInSet:set] componentsJoinedByString:@""];
}

- (NSString *)clp_stringByCollapsingWhitespace
{
    NSArray *components = [self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    components = [components filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self <> ''"]];

    return [components componentsJoinedByString:@" "];
}

@end
@实现NSString(清理)
-(NSString*)clp_StringByStrippingCharactersSet:(NSCharacterSet*)集
{
return[[self componentsSeparatedByCharactersInSet:set]componentsJoinedByString:@”“];
}
-(NSString*)clp_字符串通过折叠空格
{
NSArray*components=[self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
components=[components FilteredarrayingPredicate:[NSPredicate predicateWithFormat:@“self”];
返回[components componentsJoinedByString:@”“];
}
@结束

在Swift中,由字符串连接的
组件被
连接(…)
替换,因此这里它只是用空格替换非字母数字字符

let charactersToRemove = NSCharacterSet.alphanumericCharacterSet().invertedSet
let strippedReplacement = " ".join(someString.componentsSeparatedByCharactersInSet(charactersToRemove))

对于Swift2

var enteredByUser = field.text .. or whatever

let unsafeChars = NSCharacterSet.alphanumericCharacterSet().invertedSet

enteredByUser = enteredByUser
         .componentsSeparatedByCharactersInSet(unsafeChars)
         .joinWithSeparator("")
如果您只想删除一个字符,例如删除所有返回

 enteredByUser = enteredByUser
         .componentsSeparatedByString("\n")
         .joinWithSeparator("")

以下是作为扩展的Swift版本:

extension String {

    func stringByStrippingCharactersInSet(set:NSCharacterSet) -> String
    {
        return (self.componentsSeparatedByCharactersInSet(set) as NSArray).componentsJoinedByString("")
    }

    func stringByCollapsingWhitespace() -> String
    {
        var components:NSArray = self.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
        let predicate = NSPredicate(format: "self <> ''", argumentArray: nil)
        components = components.filteredArrayUsingPredicate(predicate)

        return components.componentsJoinedByString(" ")
    }
}
扩展字符串{
func stringByStrippingCharactersInSet(set:NSCharacterSet)->String
{
返回(self.componentsSeparatedByCharactersInSet(set)作为NSArray)。componentsJoinedByString(“”)
}
func stringbycollasingwhitespace()->String
{
var components:NSArray=self.componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
let predicate=NSPredicate(格式:“self“”,argumentArray:nil)
components=components.filteredArrayUsingPredicate(谓词)
返回组件。组件通过字符串(“”)连接
}
}

我认为普通循环的执行时间会更快:

@implementation NSString(MyUtil)

- (NSString*) stripNonNumbers {
    NSMutableString* res = [NSMutableString new];
    //NSCharacterSet *numericSet = [NSCharacterSet decimalDigitCharacterSet];
    for ( int i=0; i < self.length; ++i ) {
        unichar c = [self characterAtIndex:i];
        if ( c >= '0' && c <= '9' ) // this looks cleaner, but a bit slower: [numericSet characterIsMember:c])
            [res appendFormat:@"%c", c];
    }
    return res;
}

@end
@实现NSString(MyUtil)
-(NSString*)条带编号{
NSMutableString*res=[NSMutableString new];
//NSCharacterSet*numericSet=[NSCharacterSet decimalDigitCharacterSet];
对于(int i=0;i如果(c>='0'&&cSwift 3接受答案的版本:

let unsafeChars = CharacterSet.alphanumerics.inverted
let myStrippedString = myString.components(separatedBy: unsafeChars).joined(separator: "")

这是一种比提供的答案更有效的方法

+ (NSString *)alphanumericString:(NSString *)s {

    NSCharacterSet * charactersToRemove = [[NSCharacterSet alphanumericCharacterSet] invertedSet];
    NSMutableString * ms = [NSMutableString stringWithCapacity:[s length]];
    for (NSInteger i = 0; i < s.length; ++i) {
        unichar c = [s characterAtIndex:i];
        if (![charactersToRemove characterIsMember:c]) {
            [ms appendFormat:@"%c", c];
        }
    }
    return ms;

}
+(NSString*)字母数字字符串:(NSString*)s{
NSCharacterSet*charactersToRemove=[[NSCharacterSet alphanumericCharacterSet]InversedSet];
NSMutableString*ms=[NSMutableString stringWithCapacity:[s length]];
对于(NSInteger i=0;i
或者作为一个类别

@implementation NSString (Alphanumeric)

- (NSString *)alphanumericString {

    NSCharacterSet * charactersToRemove = [[NSCharacterSet alphanumericCharacterSet] invertedSet];
    NSMutableString * ms = [NSMutableString stringWithCapacity:[self length]];
    for (NSInteger i = 0; i < self.length; ++i) {
        unichar c = [self characterAtIndex:i];
        if (![charactersToRemove characterIsMember:c]) {
            [ms appendFormat:@"%c", c];
        }
    }
    return ms;

}

@end
@实现NSString(字母数字)
-(NSString*)字母数字字符串{
NSCharacterSet*charactersToRemove=[[NSCharacterSet alphanumericCharacterSet]InversedSet];
NSMutableString*ms=[NSMutableString stringWithCapacity:[自身长度]];
对于(NSInteger i=0;i
Swift 5,分机:

extension String {

    /// Will strip all non alpha characters from a string
    public var alpha: String {
        return components(separatedBy: CharacterSet.alphanumerics.inverted).joined()
    }
}

仅供参考,stringByTrimmingCharactersInSet:只从字符串的开头和结尾删除字符。也许这正是你想要的。嗯,说得好,肯。我不知道。它仍然适合我的需要,但这很好。在正确标记为cocoa的问题中,有5%的问题是+1,而不是客观的。什么是字母数字字符?例如.德国的“乌姆劳特”,如ä、ö或ü将包含在集合中,因此不会被修剪?要处理重音字符,您需要创建一个NSMutableCharacterSet,它是字母数字字符集和非基本字符集的联合体,并反转为
trimmedReplacement
是误导性的。在所有iOS NSString调用中,修剪意味着从开始到结束。可以吗建议替换为发生替换或带条替换?@Erik,umlauts将包含在内。这使其无法用于文件名:(@datayeah无需担心,只需更改第一行以反转“可移植文件名字符集”,如下所示:
NSCharacterSet*charactersToRemove=[[NSCharacterSet characterSetWithCharactersInString:@“ABCDEFGHIJKLMNOPQRSTUVXYZABCDFGHIJKLMNOPQRSTUVXYZ0123456789.-“]逆变器集];
”。连接(由字符分隔的组件集(set))
更好。