【问题标题】:Strip leading, trailing and more than 1 space from String从字符串中去除前导、尾随和超过 1 个空格
【发布时间】:2015-08-03 02:12:27
【问题描述】:

我有字符串:

Simple text   with    spaces

我需要选择的正则表达式:

  • 领先
  • 尾随
  • 超过 1 个空格

例子:

_ - space

_Simple text __with ___spaces_

【问题讨论】:

  • 请正确解释问题。

标签: ios regex string swift nsregularexpression


【解决方案1】:

我的 2ct:

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 = "^ +| +$| +(?= )"

【讨论】:

  • 想知道这是否优于各种可能字符串的两步法,因为更复杂的正则表达式可能更慢。
  • 请注意:正则表达式 \s 匹配空格、制表符、换行符或换页符。如果您只想匹配空间我们实际的空间
  • @AirspeedVelocity:没有显着差异。对于 1MB 文本:您的方法:0.572 秒,我的方法 0.502 秒。
【解决方案2】:

您可以通过将前导/尾随部分作为第二阶段来保持正则表达式的简单:

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

(假设你想去除所有类型的空格——你可以将其调整为只处理空格)

有更复杂的正则表达式可以一次性完成,但我个人更喜欢两步版本而不是混淆(正如@MartinR 提到的,两者之间的性能非常相似,因为修剪是一个非常轻量级的操作与更慢更复杂的正则表达式相比 - 所以它真的取决于你喜欢的外观)。

【讨论】:

  • 可能存在仅使用 stringByReplacingOccurrencesOfString 方法的方法。示例: let singlySpaced = " 带空格的简单文本 ".stringByReplacingOccurrencesOfString("REGULAR EXPRESSION", withString: "", options: .RegularExpressionSearch)。 REGULAR EXPRESSION 会选择前导、尾随和超过 1 个空格吗?附言我需要节省表演时间。
  • ^ | +| $ 一次匹配前导/尾随/不止一件事(如罗伯特的回答所示)很容易。棘手的部分是如果你想删除它,用什么替换它——你想用任何东西替换前导/尾随,但用一个空格替换多个内部空格。
【解决方案3】:

这应该清理你的字符串:

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)

【讨论】:

    【解决方案4】:

    已经提供了一些很好的答案,但如果你想要一个正则表达式,以下应该可以工作:

    ^ |(?&lt;= ) +| $

    | 表示替代项,^ 是字符串的开头,$ 表示字符串的结尾。所以这匹配字符串的开头后跟一个空格或一个或多个空格,前面有一个空格或字符串末尾的一个空格。

    【讨论】:

    • 谢谢,位`+`表达式,选择单词之间的所有空格。我需要从出现的第二个空白开始选择到结束空白组。示例word __word.
    • 你需要一个 Look-behind 断言。改变了我的答案。
    【解决方案5】:

    以下将删除所有空格

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

    【讨论】:

    • 这将适用于删除所有空格,但我相信他想留下一些空格。看来他想在单词之间留 1 个空格。
    • 对不起,请检查更新的答案......他想删除,尾随,前导和多个,这将做同样的
    • 是的,就可以了!另一件事是问题中列出的语言是Swift,您的代码是Objective-C。转换并不难,但仍然不匹配。
    • 也许不是,我没有投反对票,所以这取决于投反对票的人。
    【解决方案6】:

    此功能将在单词之间留一个空格

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

    输出:测试测试

    【讨论】:

      猜你喜欢
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多