2012-08-12 7 views
5

Utilicé satisfactoriamente replace-regexp de forma interactiva para reemplazar cada instancia de texto entre comillas en el buffer que se muestra debajo con una versión no citada. La expresión regular que busqué fuefunción de emacs re-search-forward interpreting () caracteres de grupo literalmente en regexp

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

y la NEWTEXT que inserté fue \ 1.

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

De forma interactiva, el texto anterior se convirtió en el texto a continuación.

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

Se ha intentado realizar esta misma búsqueda y reemplazar mediante programación mediante la inserción de las dos líneas siguientes

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

en la parte superior del búfer y ejecutar, sino que simplemente devuelve nil sin encontrar una única partida.

Cuando Omito la agrupación

\(\) 

y reemplace \ 1 con \ &

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

consigo cada cadena entre comillas reemplazó con '&'.

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

Todo lo que he visto en la documentación para estas dos funciones indica que se deben reconocer estos caracteres especiales, y los ejemplos de su uso en las respuestas a otras preguntas en este foro utilizar estos caracteres especiales.

¿Alguien me puede ayudar a entender por qué los caracteres de agrupación y \ &, \ N, \ no se interpretan correctamente?

Respuesta

7

Necesita escaparse de las "\" para "(", ")" y "\ 1". Es decir .:

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

Eso lo arregló. Muchas gracias! – user1593649

+2

Si no estaba claro, esto es porque '' \ '' es especial para cadenas (así como para expresiones regulares). Por lo tanto, cuando proporciona una expresión regular en formato de cadena, se debe escapar cualquier barra invertida, de lo contrario, el resultado de la evaluación de la cadena no sería la expresión regular que deseaba. – phils

+0

@ user1593649: No olvide que puede aceptar la respuesta haciendo clic en la marca hueca junto a ella. –

Cuestiones relacionadas