5

我成功地使用 replace-regexp 交互地用非引用版本替换了下面显示的缓冲区中引用文本的每个实例。我搜索的正则表达式是

\"\([^\"]*\)\" 

我插入的 NEWTEXT 是 \1。

* "PROJECT START"
:PROPERTIES:
:ID: 1
:Unique_ID: 17
:DURATION: "0 days"
:TYPE: "Fixed Work"
:OUTLINE_LEVEL: 1
:END:

交互式地,上面的文字变成了下面的文字。

* PROJECT START
:PROPERTIES:
:ID: 1
:Unique_ID: 17
:DURATION: 0 days
:TYPE: Fixed Work
:OUTLINE_LEVEL: 1
:END:

我尝试通过插入以下两行以编程方式进行相同的搜索和替换

(while (re-search-forward "\"\([^\"]*\)\"" nil t)
  (replace-match "\1" nil nil ))

在缓冲区的顶部并执行,但它只是返回 nil 而没有找到单个匹配项。

当我省略

\( \) 

分组并用 \& 替换 \1

(while (re-search-forward "\"[^\"]*\"" nil t)
  (replace-match "\&" nil nil ))

我将每个带引号的字符串都替换为“&”。

* &
:PROPERTIES:
:ID: 1
:Unique_ID: 17
:DURATION: &
:TYPE: &
:OUTLINE_LEVEL: 1
:END:

我在这两个函数的文档中看到的所有内容都表明它们应该识别这些特殊字符,并且在本论坛上回答其他问题的示例中使用了这些特殊字符。

谁能帮我理解为什么分组和 \&、\N、\ 字符没有被正确解释?

4

1 回答 1

7

您需要为“(”、“)”和“\1”转义“\”。IE:

(while (re-search-forward "\"\\([^\"]*\\)\"" nil t)
  (replace-match "\\1" nil nil ))
于 2012-08-12T16:49:28.970 回答