Как разбить длинный текст по регулярному выражению и получить все части? - PullRequest
0 голосов
/ 15 марта 2012

Я хочу разбить длинный файл scala по содержащемуся в нем javadoc на несколько частей.

source split """(?s)\/\*\*(.*?)\*\/"""

работает, но игнорирует весь javadoc, которому он соответствует.

Как достать все запчасти?

Например:

/** package */
package test

/**
 * Class user
 */
class class User

Он будет разбит на 4 части:

/** package */

и

package test

и

/**
 * Class user
 */

и

case class User

Как это сделать?

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Попробуйте:

val source = """/** package */
package test

/**
 * Class user
 */
class class User"""

val R = """(?s)/\*\*.*?\*/"""

val x = R.r.findAllIn(source)
val y = source.split(R).toList.tail

val parts = x.toList.zip(y).flatMap(x => List(x._1, x._2))

Как сказал dhg, использовать регулярные выражения для решения такой проблемы не рекомендуется.Это медленно и хрупко.

1 голос
/ 15 марта 2012

Во-первых: обратите внимание, что синтаксис языка программирования не является регулярным и, следовательно, фактически не может быть проанализирован с помощью регулярного выражения.Он не зависит от контекста, поэтому для его анализа вам потребуется как минимум контекстная грамматика.Возможно, вам удастся обойтись чем-то простым (например, подмножеством истинного синтаксиса), но невозможно написать выражение, которое будет работать во всех случаях.

Тем не менее, это работает дляслучай, который вы указали:

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 = " /** ") или * находится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...