emacs正则表达式如何获取特定列

时间:2013-12-21 08:28:26

标签: regex emacs

我有以下文本文件:

输入文字文件:

<Person FirstName='Steve' LastName='Smith' Phone='555-12345' Title='Mr.' BirthDate='1950-01-01' />

<Person FirstName='Lin' LastName='Dan' Phone='555-12345' Title='Mr.' BirthDate='1950-01-01' />

我想得到以下内容:

期望输出文字:

Steve Smith
Lin Dan

2 个答案:

答案 0 :(得分:1)

您可以将带有后向引用的正则表达式用于此:

M-x query-replace-regexp

RET .+?'\([A-Za-z]+\)'.+?'\([A-Za-z]+\)'.+

RET \1 \2

诀窍是编写一个与整行匹配的正则表达式,同时将要保留的内容放入括号组中,您可以在要生成的输出中引用它们。

另请参阅this对类似问题的回答,了解有关反向引用的更多信息以及指向Emacs手册相关部分的链接。


编辑:要替换的正则表达式的较短版本也适用于您提供的示例输入{。{1}}。

答案 1 :(得分:1)

仍然给出另一个答案,尽可能具体,使正则表达式更可靠。你想要精确插槽的内容,所以让我们使用它的名字:

(defun my-name-slots ()
  (interactive)
  (while (re-search-forward "FirstName='\\([^']+\\)'[ \t]+LastName='\\([^']+\\)'" nil t 1)
    (message "%s %s" (match-string-no-properties 1) (match-string-no-properties 2) )))

当持有输出的(match-string-no-properties 1) (match-string-no-properties 2)寻找时,

(list ...)

在函数的末尾会将其作为列表返回。