正则表达式中的重叠匹配 - Scala
Overlapping matches in Regex - Scala
我正在尝试从遵循模式 XYX 的字符串中提取 3 个字母的所有可能组合。
val text = "abaca dedfd ghgig"
val p = """([a-z])(?!)[a-z]""".r
p.findAllIn(text).toArray
当我 运行 脚本时,我得到:
aba, ded, ghg
应该是:
aba、aca、ded、dfd、ghg、gig
它不检测重叠组合。
方法包括将整个模式包含在前瞻中以仅消耗起始位置:
val p = """(?=(([a-z])(?!)[a-z]))""".r
p.findAllIn(text).matchData foreach {
m => println(m.group(1))
}
前瞻只是对当前位置的断言(测试),里面的模式不消耗字符。您要查找的结果在第一个捕获组中(这是获得结果所必需的,因为整个匹配项都是空的)。
您需要捕获整个模式并将其置于正前瞻中。 Scala 中的代码如下:
object Main extends App {
val text = "abaca dedfd ghgig"
val p = """(?=(([a-z])(?!)[a-z]))""".r
val allMatches = p.findAllMatchIn(text).map(_.group(1))
println(allMatches.mkString(", "))
// => aba, aca, ded, dfd, ghg, gig
}
请注意,反向引用将变为
,因为要检查的组的 ID = 2,而组 1 将包含您需要收集的值。
我正在尝试从遵循模式 XYX 的字符串中提取 3 个字母的所有可能组合。
val text = "abaca dedfd ghgig"
val p = """([a-z])(?!)[a-z]""".r
p.findAllIn(text).toArray
当我 运行 脚本时,我得到:
aba, ded, ghg
应该是:
aba、aca、ded、dfd、ghg、gig
它不检测重叠组合。
方法包括将整个模式包含在前瞻中以仅消耗起始位置:
val p = """(?=(([a-z])(?!)[a-z]))""".r
p.findAllIn(text).matchData foreach {
m => println(m.group(1))
}
前瞻只是对当前位置的断言(测试),里面的模式不消耗字符。您要查找的结果在第一个捕获组中(这是获得结果所必需的,因为整个匹配项都是空的)。
您需要捕获整个模式并将其置于正前瞻中。 Scala 中的代码如下:
object Main extends App {
val text = "abaca dedfd ghgig"
val p = """(?=(([a-z])(?!)[a-z]))""".r
val allMatches = p.findAllMatchIn(text).map(_.group(1))
println(allMatches.mkString(", "))
// => aba, aca, ded, dfd, ghg, gig
}
请注意,反向引用将变为 ,因为要检查的组的 ID = 2,而组 1 将包含您需要收集的值。