Elisp Regex在括号之外匹配逗号

时间:2018-11-15 21:10:35

标签: regex emacs

我在尝试使正则表达式分组正确发生时遇到问题。我有一个字符串,说:

dtASDF[a, b, c]

我使用以下表达式:

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

它将abc分别分组,这是完美的。问题在于该字符串可能是:

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

在这种情况下,上面的表达式不起作用,因为它只是在寻找逗号。因此,问题是,由于emacs没有环视功能,是否有一种方法可以按逗号分隔分组,但是如果逗号在括号之间则不能?

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

我知道SO上也存在类似的问题,但是我找不到与elisp regex相关的问题,这很棘手,因为它没有通常用于这种事情的环顾四周。

1 个答案:

答案 0 :(得分:2)

这是分组模式吗?

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

因此,全文:

"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))))
    "]")