【问题标题】:Elisp Regex Match Commas Outside of ParenthesisElisp 正则表达式匹配括号外的逗号
【发布时间】:2018-11-15 21:10:35
【问题描述】:

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

dtASDF[a, b, c]

我用的表达方式:

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

它将abc 单独分组,非常完美。问题是字符串可能是:

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

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

也就是说,这里的分组应该是:a.(b, c).(d, e)

我知道 SO 上存在类似问题,但我找不到与 elisp 正则表达式相关的问题,这很棘手,因为它没有通常用于此类事情的外观。

【问题讨论】:

  • 没有骰子。我认为您需要 emacs 中的那些双重转义。
  • 是的,那也不行。那不匹配任何东西。 Elisp 对 \\ vs \ 很奇怪 这个问题可能可以用一个更简单的例子来回答,在 elisp 中,将(asdf, asdf), asdf 过滤成两组:(asdf, asdf)asdf
  • 在我的示例中,\[.*?\] 仅匹配 dtASDF[a, .(b, c), .(d, e)] 中的句点。 \\[.*?\\] 匹配所有内容,包括 [...]

标签: regex emacs


【解决方案1】:

这个分组模式怎么样?

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

完整的:

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

【讨论】:

  • :thumbsup: 谢谢。正则表达式对我来说永远是个谜。
  • 我强烈推荐M-x re-builder(也可以查看emacs.stackexchange.com/q/5568/454)。
  • 实际上,经过进一步调查,这并不适用于我需要的一切。它解决了我的例子;但是如果我们有:dt[a, .(b = mean(c, d), d), .(e, f)] 第二个内部括号打破了它。
  • 恐怕你不能使用正则表达式来匹配任意平衡对。
  • 您可能想编写 elisp 代码来解析它,使用 forward-sexp 之类的函数来移动平衡表达式。 (这将是一个不同的问题。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多