emacs函数在regexp中重新搜索前向解释\(\)组字符

use*_*649 5 regex emacs regex-group

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

\"\([^\"]*\)\" 
Run Code Online (Sandbox Code Playgroud)

我插入的NEWTEXT是\ 1.

* "PROJECT START"
:PROPERTIES:
:ID: 1
:Unique_ID: 17
:DURATION: "0 days"
:TYPE: "Fixed Work"
:OUTLINE_LEVEL: 1
:END:
Run Code Online (Sandbox Code Playgroud)

交互式地,aboe文本变成了下面的文本.

* PROJECT START
:PROPERTIES:
:ID: 1
:Unique_ID: 17
:DURATION: 0 days
:TYPE: Fixed Work
:OUTLINE_LEVEL: 1
:END:
Run Code Online (Sandbox Code Playgroud)

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

(while (re-search-forward "\"\([^\"]*\)\"" nil t)
  (replace-match "\1" nil nil ))
Run Code Online (Sandbox Code Playgroud)

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

当我省略了

\( \) 
Run Code Online (Sandbox Code Playgroud)

将\ 1分组并替换为\&

(while (re-search-forward "\"[^\"]*\"" nil t)
  (replace-match "\&" nil nil ))
Run Code Online (Sandbox Code Playgroud)

我将每个引用的字符串替换为'&'.

* &
:PROPERTIES:
:ID: 1
:Unique_ID: 17
:DURATION: &
:TYPE: &
:OUTLINE_LEVEL: 1
:END:
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以帮助我理解为什么分组和\&,\ N,\字符没有被正确解释?

Edw*_*per 7

你需要为"(",")"和"\ 1"转义"\".即:

(while (re-search-forward "\"\\([^\"]*\\)\"" nil t)
  (replace-match "\\1" nil nil ))
Run Code Online (Sandbox Code Playgroud)

  • 如果不清楚,这是因为````对于字符串(以及正则表达式)是特殊的.因此,当您以字符串格式提供正则表达式时,任何反斜杠都需要进行转义,否则字符串求值的结果将不是您想要的正则表达式. (2认同)