Во-первых: обратите внимание, что синтаксис языка программирования не является регулярным и, следовательно, фактически не может быть проанализирован с помощью регулярного выражения.Он не зависит от контекста, поэтому для его анализа вам потребуется как минимум контекстная грамматика.Возможно, вам удастся обойтись чем-то простым (например, подмножеством истинного синтаксиса), но невозможно написать выражение, которое будет работать во всех случаях.
Тем не менее, это работает дляслучай, который вы указали:
val split = source split """(?s)/\*\*|\*/"""
val parts =
split.grouped(2).flatMap {
case Array(code,comment) => Seq(code, "/**" + comment + "*/")
case code => code
}
.map(_.trim)
.filter(_.nonEmpty)
Переменная parts
затем содержит 4 указанные вами строки.
Это выражение не будет работать, например, на входе, где содержится /**
внутри комментария Javadoc (/** /** */
) или между кавычками строкового литерала (val s = " /** "
) или * находится.