【问题标题】:emacs regular expression how to get specific columnsemacs正则表达式如何获取特定列
【发布时间】:2013-12-21 08:28:26
【问题描述】:

我有以下文本文件:

输入文本文件:

<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

【问题讨论】:

  • 别忘了,如果你想在 Emacs 中测试正则表达式,你可以使用M-x regexp-builder
  • 为了补充@Andreas Röhler 的出色答案,Emacs 可能是也可能不是正确的工具,具体取决于用例。这将如何适应更大的事情?命令行工具更有意义吗?

标签: regex emacs


【解决方案1】:

您可以为此使用带有 反向引用的正则表达式:

M-x query-replace-regexp

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

RET \1 \2

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

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


编辑:要替换的更短版本的正则表达式也适用于您提供的示例输入,即.+?'\(.+?\)'.+?'\(.+?\)'.+。

【讨论】:

    【解决方案2】:

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

    (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 ...)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 2020-07-16
      • 2022-08-08
      相关资源
      最近更新 更多