Вот один из способов сохранить внутренний пробел.
// vvv <-- 3 spaces
scala> "John Mash".split("\\b")
res0: Array[String] = Array(John, " ", Mash)
// yep, 3 spaces --> ^^^
Но вы должны быть осведомлены о том, что составляет границу "слова".
scala> "John9*&^ !@#_Mash".split("\\b")
res1: Array[String] = Array(John9, *&^ !@#, _Mash)
Для разделения , но имейте в виду, подчеркивание _
, независимо от того, где оно появляется по отношению к символам «слова», все становится немного сложнее.
scala> "John9_*&^ !@#_Ma_sh".split("((?=[\b_])|(?<=[\b_]))")
res2: Array[String] = Array(John9, _, *&^ !@#, _, Ma, _, sh)