Scala 正则表达式正面和负面同时向后看

  • 本文关键字:正则表达式 Scala regex scala
  • 更新时间 :
  • 英文 :


我有一个这样的输入字符串

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+

所以我想同时使用正面和负面的背后看。我该怎么做?

您可以在正则表达式的后视表达式中添加负后视和负前视,如下所示:

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

正则表达式演示

在这里,我们在后视条件中使用了一个交替,即:

  • (?<!_)&(?!_)|":匹配&,如果它没有前后_
  • |: 或
  • "匹配"

对于您的情况,这个较短的正则表达式也可能有效:

(?<=["&])(?<!_&)w+(?=:)

正则表达式演示 2

如果w+前面有_&(?<!_&)将跳过比赛。

您可以先使用否定字符类[^W_]w*更新模式以使其与w中的下划线不匹配

由于您只需要单个匹配项,因此可以省略捕获组()并且可以省略[:]中的方括号。

(?<=["&])[^W_]w*(?=:)
  • (?<=["&])积极向后看,断言左边的东西是"&
  • [^W_]匹配除_之外的单词字符
  • w*匹配 0+ 单词字符
  • (?=:)积极向前看,断言右边的东西是:

正则表达式演示 |斯卡拉演示

最新更新