包括scala regex.split()中的拆分模式/标记



scala.util.matching.Regex似乎只有一个split()方法,其行为是提取匹配项并仅返回输入字符串的不匹配段:

val str = "Here is some stuff PAT and second token PAT and third token PAT and fourth"
val r = "PAT".r
r.split(str)
res14: Array[String] = Array("Here is some stuff ", " and second token ", "
and third token ", " and fourth")

那么,是否有另一种常用的方法来保留返回列表中的令牌?

注意:我在实际工作中使用的拆分模式有些复杂,当然不像上面的例子那样是常量。因此,简单地插入交替的常数值(或压缩它们)是不够的。

更新这里有一个更具代表性的正则表达式

val str = "Here is some stuff PAT and second token PAT and third token 
           or something else and fourth"
val r = "(PAT|something else)".r
r.split(str)
res14: Array[String] = Array("Here is some stuff ", " and second token ", "
and third token ", " and fourth")

对于不涉及无限宽度图案的非复杂图案,您可以使用lookbackhine/lookahead解决方案:

val str = "Here is some stuff PAT and second token PAT and third token PAT and fourth"
val r = "((?<=PAT)|(?=PAT))".r
print(r.split(str).toList)

示例演示的输出:List(Here is some stuff , PAT, and second token , PAT, and third token , PAT, and fourth)

这个想法只是匹配(?<=PAT)之前的空字符串和(?=PAT)之后的PAT模式,并且只在那里拆分。不幸的是,没有像使用带有捕获组的regex进行拆分并将捕获的文本作为结果数组/列表的元素这样方便的功能。

作为替代方案,应使用findAllIn匹配的正则表达式。或者,可以在分隔模式的前面或末尾创建临时的一个字符分隔符,以进一步拆分它们。

最新更新