代码之家  ›  专栏  ›  技术社区  ›  Knows Not Much

scala regex正负同时看后面

  •  1
  • Knows Not Much  · 技术社区  · 5 年前

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

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

    我想提取 abc ghi 所以我写了这个正则表达式

    val regex = """(?<=["&])(\w+)(?=[:])""".r
    regex.findAllIn(input).foreach(println)
    

    所以基本上我有一个展望 : 再看看后面 " & 是的。

    到现在为止,一直都还不错。但现在我有了这样的输入

    val input = """["abc:de_&_f:xyz&ghi:jkl"]"""
    

    它匹配

    abc
    _f
    ghi
    

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

    匹配A \w+ 当向前看是真的 以下内容: 向后看是真的 & 为…作假 _&_

    所以我想同时用积极和消极的眼光看后面。我该怎么做?

    2 回复  |  直到 5 年前
        1
  •  3
  •   anubhava    5 年前

    您可以在regex的lookbehind表达式中添加负lookbehind和负lookahead,如下所示:

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

    RegEx Demo

    在这里,我们在lookbehind条件中使用一个替换,即:

    • (?<!_)&(?!_)|" :匹配 & 如果它的前面和后面没有 _
    • | :或
    • " 比赛 “。”

    对于您的情况,此较短的regex也可以工作:

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

    RegEx Demo 2

    (?<!_&) 如果 \w+ 前面是 _& 是的。

        2
  •  2
  •   The fourth bird    5 年前

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

    因为只需要一个匹配项,所以可以省略捕获组 () 和方括号 [:] 可以省略。

    (?<=["&])[^\W_]\w*(?=:)
    
    • (?<=["&]) 积极地看后面,断言左边是什么 " &
    • [^\W_] 匹配单词char,除了 _
    • \w* 匹配0+字字符
    • (?=:) 向前看,断言右边的是 :

    Regex demo | Scala demo