Regex 如何按正则表达式拆分长文本并获取所有部分?

Regex 如何按正则表达式拆分长文本并获取所有部分?,regex,scala,Regex,Scala,我想将一个长的scala文件按其包含的javadoc拆分为几个部分 source split """(?s)\/\*\*(.*?)\*\/""" 工作正常,但它将忽略它匹配的所有javadoc 如何获得所有零件 例如: /** package */ package test /** * Class user */ class class User 它将分为4个部分: /** package */ 及 及 及 如何做到这一点?首先:请注意,编程语言语法不是正则的,因此实际上无法用正则表

我想将一个长的scala文件按其包含的javadoc拆分为几个部分

source split """(?s)\/\*\*(.*?)\*\/"""
工作正常,但它将忽略它匹配的所有javadoc

如何获得所有零件

例如:

/** package */
package test

/**
 * Class user
 */
class class User
它将分为4个部分:

/** package */


如何做到这一点?

首先:请注意,编程语言语法不是正则的,因此实际上无法用正则表达式进行解析。它是上下文无关的,因此,您至少需要一个上下文无关的语法来解析它。对于简单的情况(即,真正语法的子集),您可能可以勉强应付,但不可能编写一个在所有情况下都能工作的表达式

也就是说,这适用于您提供的案例:

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=“/**”
)的引号之间找到一个值。

请尝试以下操作:

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所说,不建议使用正则表达式来解决此类问题。它缓慢而脆弱

相关:谢谢,我知道如果我想得到准确的结果,我需要使用解析器,但是简单的正则表达式就足够了。我尝试了
findAllIn
split
,但没有一起尝试。
case class User
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)
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))