从字符串中删除开头、结尾和超过1个空格以上的空格。

5

我有一个字符串:

Simple text   with    spaces

我需要一个正则表达式,可以选择以下内容:

  • 开头有空格
  • 结尾有空格
  • 两个以上的空格

例如:

_ - space

_Simple text __with ___spaces_

请正确解释问题。 - Ashok Londhe
6个回答

5
我的建议:
let text = "    Simple text   with    spaces    "
let pattern = "^\\s+|\\s+$|\\s+(?=\\s)"
let trimmed = text.stringByReplacingOccurrencesOfString(pattern, withString: "", options: .RegularExpressionSearch)
println(">\(trimmed)<") // >Simple text with spaces<

^\s+\s+$匹配字符串开头/结尾处的一个或多个空格字符。

棘手的部分是\s+(?=\s)模式,它匹配一个或多个空格字符,后面紧跟着另一个空白字符,并且本身不被认为是匹配的一部分(即“前瞻断言”)。

通常情况下,\s匹配所有空白字符,例如空格字符本身、水平制表符、换行符、回车符、换页符等。如果你只想删除(重复的)空格字符,则将该模式替换为

let pattern = "^ +| +$| +(?= )"

很有趣的是,如果考虑到更复杂的正则表达式可能会更慢,那么对于各种可能的字符串,这是否比两步法更快呢? - Airspeed Velocity
只是一个提示:正则表达式\s匹配空格、制表符、换行符或进纸符。如果你只想匹配空格,请使用实际的空格。 - Robert Smit
@AirspeedVelocity:没有显著的差异。对于1MB文本:你的方法需要0.572秒,我的方法需要0.502秒。 - Martin R

3

您可以将正则表达式简化,通过将前导/尾随部分作为第二阶段来完成:

 let singlySpaced = " Simple text   with    spaces   "
      .stringByReplacingOccurrencesOfString("\\s+", withString: " ", options: .RegularExpressionSearch)
      .stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())

(假设您希望去除所有类型的空格 - 您可以轻松地将其调整为仅执行空格)
有更复杂的正则表达式可以一次完成,但我个人更喜欢两步版本而不是混淆(正如@MartinR提到的,性能在两者之间非常相似,因为修剪是一项非常轻量级的操作,而不是更慢的多功能正则表达式 - 所以这实际上取决于您更喜欢哪种外观)。

也许存在一种只使用stringByReplacingOccurrencesOfString方法的方式。例如:let singlySpaced = " Simple text with spaces ".stringByReplacingOccurrencesOfString("正则表达式", withString: "", options: .RegularExpressionSearch)。正则表达式将选择前导、尾随和多个空格?附言:我需要节省执行时间。 - Artem Krachulov
使用 ^ | +| $ 可以轻松地一次匹配前导/尾随/多个内容(正如 Robert 的答案所示)。棘手的部分是,如果您想要剥离,那么要用什么来替换它-您想用空白替换前导/尾随,但用单个空格替换多个内部空格。 - Airspeed Velocity

1
一些好的答案已经被提供,但如果您想要一个正则表达式,以下内容应该有效:
^ |(?<= ) +| $
“|”表示选项,“^”是字符串的开头,“$”表示字符串的结尾。因此,这将匹配字符串的开头后跟一个空格,或者一个或多个空格之前有一个空格,或者字符串末尾的一个空格。

谢谢,位运算+表达式,选择单词之间的所有空格。我需要从第二个空格开始选择,一直到空格组的末尾。例如 word __word - Artem Krachulov
你需要一个“向后查找断言”来实现。我修改了我的答案。 - Robert Smit

1
这应该可以清理你的字符串:
var string : NSString = "  hello    world.  "
while string.rangeOfString("  ").location != NSNotFound { //note the use of two spaces
    string = string.stringByReplacingOccurrencesOfString("  ", withString: " ")
}
println(string)
string = string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
println(string)

0
以下代码将删除所有空格。
NSString *spaces =@"hi how are you "; 

NSString *withoutSpace= [spaces stringByReplacingOccurrencesOfString:@"  " 
                               withString:@" "];
withoutSpace = [withoutSpace stringByTrimmingCharactersInSet:
                              [NSCharacterSet whitespaceCharacterSet]];

这将适用于删除所有空格,但我相信他想留下一些空格。看起来他想在单词之间留下一个空格。 - user887210
抱歉,请检查更新的答案... 他想要去掉前导、尾随和多余的逗号,这将达到同样的效果。 - MOHAMMAD ISHAQ
没错,就是这样!另外一个问题是,问题中列出的语言是Swift,而你的代码是Objective-C。虽然转换不难,但仍然不匹配。 - user887210
也许不是我,我没有给它点踩,所以应该看看是谁干的。 - user887210

-1

此函数将在单词之间留下一个空格

let accountNameStr = "   test    test   "
    let trimmed = accountNameStr.replacingOccurrences(of: "\\s+", with: " ", options: .regularExpression)
    let textWithoutSpace = trimmed.trimmingCharacters(in: .whitespaces)

输出: 测试 测试

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接