我有这样的输入字符串

val input = """["abc:def&ghi:jkl"]"""

我想提取abcghi,所以我写了这个有效的正则表达式
val regex = """(?<=["&])(\w+)(?=[:])""".r
regex.findAllIn(input).foreach(println)

因此,基本上,我对:有所了解,对"&有所了解。

到目前为止,一切都很好。但是现在我有这样的输入
val input = """["abc:de_&_f:xyz&ghi:jkl"]"""

它匹配
abc
_f
ghi

我想改变我的正则表达式的逻辑。

\w+的前向为true且:的前向为true且&的值为false时,匹配_&_
因此,我想同时使用正面和负面的表情。我怎么做?

最佳答案

您可以在正则表达式的lookbehind表达式内添加负向后看和负向前看,如下所示:

(?<=(?:(?<!_)&(?!_)|"))\w+(?=:)

RegEx Demo

在这里,我们在后向条件中使用了一种交替:
  • (?<!_)&(?!_)|":如果未在&之前和之后跟随_,则匹配|
  • ":或
  • "匹配(?<!_&)


  • 对于您的情况,此较短的正则表达式也可能有效:
    (?<=["&])(?<!_&)\w+(?=:)
    

    RegEx Demo 2

    如果\w+前面有_&,ojit_code将跳过比赛。

    10-08 00:37