【问题标题】:Emacs query-replace-regexp multilineEmacs 查询替换正则表达式多行
【发布时间】:2010-11-21 11:56:03
【问题描述】:

如何在 Emacs 中执行查询替换正则表达式以匹配多行?

作为一个简单的例子,我希望 <p>\(.*?\)</p> 匹配

<p>foo
bar
</p>

【问题讨论】:

  • 我假设你看到了 emacswiki:emacswiki.org/emacs/MultilineRegexp
  • 是的,我看到了,但使用 query-replace-regexp 无法让它工作。仍在尝试使用 re-builder 对其进行测试...希望我能尽快解决
  • 这个例子很糟糕,因为用正则表达式解析HTML通常不是一个好主意。
  • 很明显,尝试解析(例如使用正则表达式反序列化或抓取 HTML)与使用它来节省时间并在编辑时输入内容是有区别的。

标签: regex emacs


【解决方案1】:
M-x re-builder

是你的朋友。它让我想到了这个正则表达式:

"<p>\\(.\\|\n\\)*</p>"

这是字符串版本

<p>\(.\|^J\)*</p>         ;# where you enter ^J by C-q C-j

当我重新搜索转发时,这对我有用,但当我做 'query-replace-regexp 时,这对我有用。不知道为什么...

现在,在执行're-search-forward(又名C-u C-s)时,您可以输入M-%,它将提示您进行替换(从 Emacs 22 开始)。因此,您可以使用它来进行搜索并替换为上述正则表达式。

注意,上面的正则表达式将匹配到 last &lt;/p&gt; 在缓冲区中找到,这可能不是你想要的,所以使用 re-builder 构建一个更接近于什么的正则表达式你要。显然,正则表达式不能计算括号,因此您只能靠自己 - 取决于您想要的解决方案有多强大。

【讨论】:

  • 是否有re-builder的信息文件?我很好奇如何使用它。
  • 我找不到。 Emacs Wiki 也没有太多内容。但这很不言自明(不是所有的 Emacs :)。输入re-builder后,输入C-c C-h,你会得到一个绑定列表,包括那些适用于re-builder的绑定,它们都以C-c开头。
  • 是的,我做到了。只是在寻找更深入的东西。谢谢!
  • “搜索失败,状态为 0: grep: Unmatched ( or \(“
【解决方案2】:

尝试字符类。只要您只使用 ASCII 字符集,就可以使用 [[:ascii:]] 代替点。使用更长的[[:ascii:][:nonascii:]] 应该可以解决所有问题。

【讨论】:

  • 如果您不只使用 ASCII?
  • [[:ascii:][:nonascii:]]* 给我堆栈溢出
  • @helcim 您应该通过在末尾添加 ? 使其不贪婪。
  • “搜索失败,状态为 0:grep:无效字符类名”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多