代码之家  ›  专栏  ›  技术社区  ›  C-x C-c

Elisp Regex匹配括号外的逗号

  •  0
  • C-x C-c  · 技术社区  · 6 年前

    我在尝试正确进行正则表达式分组时遇到问题。我有一根绳子,说:

    dtASDF[a, b, c]

    我用的表达式是:

    dt\\(.*\\)\\[\\(.*\\), \\(.*\\), \\(.*\\)\\]

    它将 a , b ,和 c 另外,这是完美的。问题是字符串可能是:

    dtASDF[a, .(b, c), .(d, e)]

    在这种情况下,上面的表达式不起作用,因为它只是寻找逗号。所以问题是,既然emacs没有lookaround,有没有一种方法可以通过逗号分隔来分组,但是如果逗号在括号之间,就不行了?

    换句话说,这里的分组应该是: , .(b, c) , .(d, e) .

    我知道在SO上也存在类似的问题,但是我找不到一个与elisp regex相关的问题,这是很棘手的,因为它没有典型的用于此类事情的lookaround。

    1 回复  |  直到 6 年前
        1
  •  2
  •   phils    6 年前

    这个分组模式怎么样?

    "\\(\\.([^)]*)\\|.*?\\)"
    

    因此,全文如下:

    "dt\\(.*\\)\\[\\(\\.([^)]*)\\|.*?\\), \\(\\.([^)]*)\\|.*?\\), \\(\\.([^)]*)\\|.*?\\)\\]"
    

    n、 b.如果你想用 rx 宏,可以这样写:

    (rx "dt" (group (zero-or-more not-newline)) "["
        (group (or (seq ".(" (zero-or-more (not (any ")"))) ")")
                   (minimal-match (zero-or-more not-newline))))
        ", "
        (group (or (seq ".(" (zero-or-more (not (any ")"))) ")")
                   (minimal-match (zero-or-more not-newline))))
        ", "
        (group (or (seq ".(" (zero-or-more (not (any ")"))) ")")
                   (minimal-match (zero-or-more not-newline))))
        "]")