Regex emacs正则表达式如何获取特定列
我有以下文本文件: 输入文本文件:Regex emacs正则表达式如何获取特定列,regex,emacs,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 您可以
<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
您可以使用带有反向引用的regexp:
M-xquery replace regexp
RET+?'\([A-Za-z]+\)。+?'\([A-Za-z]+\)。++
RET\1\2
诀窍是编写一个匹配整行的regexp,同时将要保留的内容放入括号内的组中,以便在要生成的输出中引用
另请参阅对类似问题的回答,以了解有关反向参考的更多信息以及指向Emacs手册相关部分的链接
编辑:要替换的regexp的较短版本也适用于您给出的示例输入,它将是
+?'\(.+?\)'.+?'\(.+?\)。++
给出另一个答案,尽可能具体使正则表达式更可靠。您需要精确插槽的内容,因此让我们使用其名称:
(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) )))
作为持有查找的输出的(匹配字符串无属性1)(匹配字符串无属性2)
(list ...)
在函数末尾,它将作为列表返回。不要忘记,如果您想在Emacs中测试正则表达式,可以使用
M-x regexp builder
添加到@Andreas Röhler的伟大答案中,Emacs可能是也可能不是用于此的正确工具,这取决于用例。这将如何适应更大的东西?命令行工具更有意义吗?