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

Jef*_*ley 68 cocoa cocoa-touch nsstring nscharacterset

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

use*_*008 144

我们可以通过拆分然后加入来做到这一点.对于componentsSeparatedByCharactersInSet,需要OS X 10.5+:

NSCharacterSet *charactersToRemove = [[NSCharacterSet alphanumericCharacterSet] invertedSet];
NSString *strippedReplacement = [[someString componentsSeparatedByCharactersInSet:charactersToRemove] componentsJoinedByString:@""];
Run Code Online (Sandbox Code Playgroud)

  • @datayeah不用担心,只需根据http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_277更改第一行以反转'Portable Filename Character Set':`NSCharacterSet*charactersToRemove = [[ NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ._-"] invertedSet];` (4认同)
  • 要处理重音字符,您需要创建一个NSMutableCharacterSet,它是alphanumericCharacterSet和nonBaseCharacterSet的并集,并将其反转 (3认同)
  • 什么是字母数字字符?例如德国的"Umlaute",如ä,ö或ü是否包含在套装中,因此不会被修剪? (2认同)

Amr*_*fie 21

在Swift中,它componentsJoinedByString被替换为join(...),所以这里只是用空格替换非字母数字字符.

let charactersToRemove = NSCharacterSet.alphanumericCharacterSet().invertedSet
let strippedReplacement = " ".join(someString.componentsSeparatedByCharactersInSet(charactersToRemove))
Run Code Online (Sandbox Code Playgroud)

对于Swift2 ......

var enteredByUser = field.text .. or whatever

let unsafeChars = NSCharacterSet.alphanumericCharacterSet().invertedSet

enteredByUser = enteredByUser
         .componentsSeparatedByCharactersInSet(unsafeChars)
         .joinWithSeparator("")
Run Code Online (Sandbox Code Playgroud)

如果你只想删除一个字符,例如删除所有返回...

 enteredByUser = enteredByUser
         .componentsSeparatedByString("\n")
         .joinWithSeparator("")
Run Code Online (Sandbox Code Playgroud)


Jef*_*ley 19

我最后做的是创建一个NSCharacterSet和-invertedSet我发现的方法(这是一个奇迹,额外的一小时睡眠对文档阅读能力有什么影响).这是代码片段,假设someString您要从中删除非字母数字字符的字符串:

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

NSString *trimmedReplacement =
[ someString stringByTrimmingCharactersInSet:charactersToRemove ];
Run Code Online (Sandbox Code Playgroud)

trimmedReplacement然后将包含someString字母数字字符.

  • FYI,stringByTrimmingCharactersInSet:仅从字符串的开头和结尾删除字符.也许这就是你想要的. (26认同)

Tra*_* M. 6

Swift 3版本的接受答案:

let unsafeChars = CharacterSet.alphanumerics.inverted
let myStrippedString = myString.components(separatedBy: unsafeChars).joined(separator: "")
Run Code Online (Sandbox Code Playgroud)