如何从Swift中的字符串中删除空格?

Vik*_*yuk 5 string swift

我需要删除标点字符周围的前导和尾随空格.

例如: Hello , World ... I 'm a newbie iOS Developer.

而且我想:> Hello, World... I'm a newbie iOS Developer.

我怎样才能做到这一点?我试图获取字符串的组成部分并按句子枚举它.但这不是我需要的

Lil*_*ard 6

Rob 的回答很棒,但是您可以通过利用\p{Po}正则表达式类来减少很多。去掉标点符号周围的空格然后变成单个正则表达式替换:

import Foundation

let input = "Hello ,  World ... I 'm a newbie iOS Developer."
let result = input.replacingOccurrences(of: "\\s*(\\p{Po}\\s?)\\s*",
                                        with: "$1",
                                        options: [.regularExpression])
print(result) // "Hello, World... I'm a newbie iOS Developer."
Run Code Online (Sandbox Code Playgroud)

Rob 的回答还尝试修剪前导/尾随空格,但您的输入没有任何这些。如果您确实关心这一点,则可以调用result.trimmingCharacters(in: .whitespacesAndNewlines)结果。


这是正则表达式的解释。删除它看起来像的双重转义

import Foundation

let input = "Hello ,  World ... I 'm a newbie iOS Developer."
let result = input.replacingOccurrences(of: "\\s*(\\p{Po}\\s?)\\s*",
                                        with: "$1",
                                        options: [.regularExpression])
print(result) // "Hello, World... I'm a newbie iOS Developer."
Run Code Online (Sandbox Code Playgroud)

这由以下组件组成:

  • \s* - 匹配零个或多个空白字符(并将它们扔掉)
  • (…)- 捕获组。该组内的任何内容都由替换保留($1替换中的指的是该组)。
    • \p{Po}- 匹配“Other_Punctuation”Unicode 类别中的单个字符。这包括诸如.,'和 之类的内容,但不包括诸如(或 之类的内容-
    • \s?- 匹配一个可选的空白字符。这会保留句点(或省略号)后的空间。
  • \s*- 再次匹配零个或多个空白字符(并将它们扔掉)。这就是将您, World变成, World.


Fox*_*150 6

对于 Swift 3 或 4,您可以使用:

let trimmedString = string.trimmingCharacters(in: .whitespaces)
Run Code Online (Sandbox Code Playgroud)

  • 仅当空格位于字符串的开头或结尾时,此方法才有效。它将忽略单词之间的任何空格。 (2认同)

Rob*_*ier 5

这是一个非常美妙的问题,遗憾的是今天在 Swift 中做到这一点并不容易(总有一天会这样,但不是今天)。

我有点讨厌这个代码,但我要坐飞机 20 个小时,而且没有时间让它变得更好。这至少可以让您开始使用NSMutableString. 在 中工作会很好String,而且 Swift 讨厌正则表达式,所以这有点可怕,但至少这是一个开始。

import Foundation

let input = "Hello,  World ... I 'm a newbie iOS Developer."

let adjustments = [
    (pattern: "\\s*(\\.\\.\\.|\\.|,)\\s*", replacement: "$1 "), // elipsis or period or comma has trailing space
    (pattern: "\\s*'\\s*", replacement: "'"), // apostrophe has no extra space
    (pattern: "^\\s+|\\s+$", replacement: ""), // remove leading or trailing space
]

let mutableString = NSMutableString(string: input)

for (pattern, replacement) in adjustments {
    let re = try! NSRegularExpression(pattern: pattern)
    re.replaceMatches(in: mutableString,
                      options: [],
                      range: NSRange(location: 0, length: mutableString.length),
                      withTemplate: replacement)
}
mutableString // "Hello, World... I'm a newbie iOS Developer."
Run Code Online (Sandbox Code Playgroud)

当您第一次遇到正则表达式时,它们可能会非常令人困惑。阅读这些的一些提示:

  • Foundation 使用的特定语言由ICU描述。

  • 反斜杠 (\) 表示正则表达式的“下一个字符是特殊的”。但是在 Swift 字符串中,反斜杠表示字符串的“下一个字符是特殊的”。所以你必须把它们全部加倍。

  • \s 表示“空白字符”

  • \s* 表示“零个或多个空白字符”

  • \s+ 表示“一个或多个空白字符”

  • $1 表示“我们在括号中匹配的东西”

  • | 意思是“或”

  • ^ 表示“字符串的开始”

  • $ 表示“字符串结束”

  • . 表示“任何字符”,因此要表示“实际的点”,您必须键入“\\”。在 Swift 字符串中。

请注意,我检查了“...”和“.”。在同一个正则表达式中。你必须做类似的事情,否则“。” 将在“...”内匹配 3 次。另一种方法是首先将“...”替换为“...”(单个省略号字符,在 Mac 上按 Opt-; 键输入)。那么“...”是一个单字符的标点符号。(您也可以决定在流程结束时将所有省略号重新展开为点-点-点。)

像这样的事情可能是我在现实生活中的做法,完成并交付,但是尝试将其构建为逐个字符的状态机,以一个字符行走一个字符可能值得痛苦/实践时间,并跟踪您当前的状态。


小智 2

您可以尝试对每个标点符号进行类似 string.replacingOccurrences(of: " ,", with: ",") 的操作...