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
匹配的正则表达式。或者,可以在分隔模式的前面或末尾创建临时的一个字符分隔符,以进一步拆分它们。