2015-04-16 56 views
9

我有一个由单词组成的字符串,其中一些包含标点符号,我想删除它,但我一直无法弄清楚如何执行此操作。如何从字符串中删除或替换所有标点符号?

例如,如果我有像

var words = "Hello, this : is .. a string?" 

我希望能够创建与

"[Hello, this, is, a, string]" 

我原以为阵列是使用类似words.stringByTrimmingCharactersInSet(),以消除任何字符我不想要,但那只会使角色脱离目的。

我想也许我可以通过串的东西在

for letter in words { 
    if NSCharacterSet.punctuationCharacterSet.characterIsMember(letter){ 
     //remove that character from the string 
    } 
} 

静脉循环,但我不能确定如何删除字符串中的字符。我相信,如果声明也被设置好了,但它会显示我的思维过程。

回答

10

的Xcode 8.3.2•夫特3.1

extension String { 
    var words: [String] { 
     return components(separatedBy: .punctuationCharacters) 
      .joined() 
      .components(separatedBy: .whitespaces) 
      .filter{!$0.isEmpty} 
    } 
} 

let sentence = "Hello, this : is .. a string?" 
let myWordList = sentence.words // ["Hello", "this", "is", "a", "string"] 
+0

我最终使用了这些解决方案中的一些解决方案的混合体来实现它,但这个帮助我获得了我修复的最后一个错误。我最终创建了一个名为alphanumericCharacterSet加上“”的NSMutableCharacterset。然后,我使用这里的解决方案来获得我所需要的,而没有额外的空间。 – qmlowery

0

NSScaner方式:

let words = "Hello, this : is .. a string?" 

// 
let scanner = NSScanner(string: words) 
var wordArray:[String] = [] 
var word:NSString? = "" 

while(!scanner.atEnd) { 
    var sr = scanner.scanCharactersFromSet(NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKMNOPQRSTUVWXYZ"), intoString: &word) 
    if !sr { 
    scanner.scanLocation++ 
    continue 
    } 
    wordArray.append(String(word!)) 
} 

println(wordArray) 
+0

这并不对空格字符分开。 – halex

+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 –

+0

@halex对不起,发布信息。我修改了我的帖子。 – nickcheng

-1
let charactersToRemove = NSCharacterSet.punctuationCharacterSet().invertedSet 
let aWord = "".join(words.componentsSeparatedByCharactersInSet(charactersToRemove)) 
0

从一组过滤字符和获得的另一种方法数组o f字是通过使用数组的filterreduce方法。它不像其他答案那样紧凑,但它表明如何以不同的方式获得相同的结果。

首先定义字符数组移除:

let charactersToRemove = Set(Array(".:?,")) 

旁边的输入字符串转换成字符数组:

let arrayOfChars = Array(words) 

现在我们可以使用reduce建立一个字符串,获得通过追加arrayOfChars中的元素,但跳过charactersToRemove中包含的所有元素:

let filteredString = arrayOfChars.reduce("") { 
    let str = String($1) 
    return $0 + (charactersToRemove.contains($1) ? "" : str) 
} 

这会生成一个没有标点符号的字符串(如charactersToRemove中所定义)。

最后2个步骤:

的字符串分割成单词的阵列,使用空白字符作为分隔符:

let arrayOfWords = filteredString.componentsSeparatedByString(" ") 

最后,删除所有空元素:

let finalArrayOfWords = arrayOfWords.filter { $0.isEmpty == false } 
3

String有一个enumerateSubstringsInRange()方法。 随着.ByWords选项,它会检测单词边界,并自动 标点符号:

斯威夫特3/4:

let string = "Hello, this : is .. a \"string\"!" 
var words : [String] = [] 
string.enumerateSubstrings(in: string.startIndex..<string.endIndex, 
            options: .byWords) { 
            (substring, _, _, _) ->() in 
            words.append(substring!) 
} 
print(words) // [Hello, this, is, a, string] 

斯威夫特2:

let string = "Hello, this : is .. a \"string\"!" 
var words : [String] = [] 
string.enumerateSubstringsInRange(string.characters.indices, 
    options: .ByWords) { 
     (substring, _, _, _) ->() in 
     words.append(substring!) 
} 
print(words) // [Hello, this, is, a, string] 
+2

感谢enumerateSubstringsInRange&.ByWords。很有意思。 –

+0

此代码需要更新为swift 4或可能很快3 –

+0

@InderKumarRathore:更新为Swift 3.(它也应该在Swift 4中工作,稍后我会检查) - 感谢您的通知! –

2

这工作和Xcode 8.1 ,斯威夫特3:

首先通过CharacterSet限定用于过滤通用延伸:

extension String { 
    func removingCharacters(inCharacterSet forbiddenCharacters:CharacterSet) -> String 
{ 
    var filteredString = self 
    while true { 
     if let forbiddenCharRange = filteredString.rangeOfCharacter(from: forbiddenCharacters) { 
     filteredString.removeSubrange(forbiddenCharRange) 
     } 
     else { 
     break 
     } 
    } 

    return filteredString 
    } 
} 

然后过滤中使用标点符号:

let s:String = "Hello, world!" 
s.removingCharacters(inCharacterSet: CharacterSet.punctuationCharacters) // => "Hello world" 
相关问题