Регулярное выражение заменяет пробелы в каждой новой строке

#swift #regex #nsregularexpression

#swift #регулярное выражение #nsregularexpression

Вопрос:

Я сохраняю вводимые пользователями данные в БД в виде строки и хотел бы удалить все пробелы в каждой строке.

Ввод от пользователя:

 Hi!

My name is:
   Bob

I am from the USA.
  

Я хочу удалить пробелы между «Bob», поэтому результат будет:

 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», я не хочу этого делать.
После того, как я выполню приведенный выше код: "1nnn 2" -> "1n2" . Результат, который мне нужен: "1nnn2" (удаляются только пробелы, а не новые строки).

Ответ №1:

Нет необходимости в регулярных выражениях, разделите строку на символ новой строки в массив, а затем обрежьте все строки и снова соедините их вместе

 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"}
    
  

Ответ №2:

Вы можете использовать

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

На самом деле, поскольку в шаблоне нет символов регистра, вы можете удалить .caseInsensitive и использовать:

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

Смотрите демонстрацию регулярных выражений. Шаблон означает:

  • (?m) — включить многострочный режим
  • ^ — из-за того (?m) , что оно соответствует любой начальной позиции строки
  • h — один или несколько горизонтальных пробелов.

Пример кода Swift:

 let txt = "Hi!nnMy name is:n   BobnnI 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.