正则表达式会在每行中替换空格

问题描述

我将用户输入的db保存为字符串,我想删除每一行的所有空格。

用户输入:

Hi!

My name is:
   Bob

I am from the USA.

我想删除“鲍勃”之间的空格,所以结果将是:

Hi!

My name is:
Bob

I am from the USA.

我正在尝试使用以下代码

let regex = try! NSRegularExpression(pattern: "\n[\\s]+",options: .caseInsensitive)
a = regex.stringByReplacingMatches(in: a,options: [],range: NSRange(0..<a.utf16.count),withTemplate: "\n")

但是此代码替换了多个新行“ \ n”,我不想这样做。 运行上面的代码后:"1\n\n\n 2"-> "1\n2"。我需要的结果是:"1\n\n\n2"(仅删除空格,不删除新行)。

解决方法

您可以使用

let regex = try! NSRegularExpression(pattern: "(?m)^\\h+",options: .caseInsensitive)

实际上,由于该模式中没有大小写字符,因此您可以删除.caseInsensitive并使用:

let regex = try! NSRegularExpression(pattern: "(?m)^\\h+",options: [])

请参见regex demo。该模式表示:

  • (?m)-启用多行模式
  • ^-由于(?m),它匹配任何行的起始位置
  • \h+-一个或多个水平空白。

快速代码示例:

let txt = "Hi!\n\nMy name is:\n   Bob\n\nI am from the USA."
let regex = "(?m)^\\h+"
print( txt.replacingOccurrences(of: regex,with: "",options: [.regularExpression]) )

输出:

Hi!

My name is:
Bob

I am from the USA.
,

不需要正则表达式,将新行字符上的字符串拆分为一个数组,然后修剪所有行并将它们重新连接在一起

let trimmed = string.components(separatedBy: .newlines)
    .map { $0.trimmingCharacters(in: .whitespaces) }
    .joined(separator: "\n")

或者您可以使用reduce

let trimmed = string.components(separatedBy: .newlines)
    .reduce(into: "") { $0 += "\($1.trimmingCharacters(in: .whitespaces))\n"}
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...