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