【问题标题】:Notepad++ newline in regex正则表达式中的记事本++换行符
【发布时间】:2010-12-09 13:18:17
【问题描述】:

假设你有这个文件:

x
a
b
c
x
x
a
b
c
x
x

你想用 Notepad++ 找到 sequence abc(并选择整 3 行)。请问如何用正则表达式表示换行符?

【问题讨论】:

  • 确保打开matches newline选项,正如this thread中提到的那样
  • @aljipa 如果在特定位置需要换行符,则不需要该选项。

标签: find notepad++ multilinestring


【解决方案1】:

Notepad++ 可以轻松做到这一点,您甚至不需要正则表达式

在查找对话框中查看左下角并将您的搜索模式切换到允许 \n 等的扩展。

如果您正在处理 Windows 格式的文件,您可能会寻找 \r\n(回车,换行符)

a\r\nb\r\nc

将找到超过三行的模式

【讨论】:

  • 哦.. 好吧,我试过了\nb\nc .. 忘记了回车。谢谢!
  • 有时需要使用正则表达式搜索换行符(如果您想进行更复杂的搜索,包括换行符)。不可能在下一个答案中详细说明
  • 请注意,我徒劳地尝试使用“正则表达式”(而不是“扩展”)让换行符在 Notepad++ 5.9.3 中工作!它在 Notepad++ 6.0 中运行良好 - 请参阅下面的 darioo 的答案。
  • 我不认为这是正确的,问的是正则表达式,而不是扩展模式。在正则表达式中可能 \x0D 是换行符,而 \x0A 是回车符,请参阅答案stackoverflow.com/a/4398728/4459336
【解决方案2】:

2012 年 6 月 18 日更新

使用新的Notepad++ v6,您确实可以使用正则表达式搜索换行符。所以你可以使用

a\r\nb\r\nc

即使使用正则表达式来完成你想要的。注意\r\n 是换行符的 Windows 编码。在 Unix 文件中,它只是 \n

不幸的是,在使用正则表达式搜索时,您无法在 Notepad++ 中执行此操作。 Notepad++ 基于 Scintilla 编辑器组件,它不处理正则表达式中的换行符。

您可以使用扩展搜索进行换行搜索,但我认为这不会帮助您搜索 3 行。

更多信息here

更新:Robb 和 StartClass0830 关于扩展搜索是正确的。它确实有效,但在使用正则表达式搜索时无效。

【讨论】:

  • 我认为这个答案是错误的。请参阅 Robb 的答案和我的答案以验证此答案是否错误。
  • @StartClass0830:我已经尝试过您和 Robb 的答案,但无法进行多行匹配。编辑:是的,它在使用扩展搜索时确实有效。但不是在使用正则表达式时。你是对的。
  • 假设该行以 \r \n 结尾。也许在您的环境中,该文件的行仅以 \n 结尾(没有 \r)。
  • 无论如何.. 有什么比 Notepad++ 更全面的 REGEX 支持的吗?
  • @PaN1C_Showt1Me:嗯,总是有 Vim 和 Emacs。我都使用过它们,它们非常强大的正则表达式支持。但学习曲线总是让人们望而却步。我建议你访问vim.org,下载 Vim 并阅读教程,然后再尝试使用它。
【解决方案3】:
^a\x0D\x0Ab\x0D\x0Ac

这将起作用 \x0D 是换行符,\x0A 是回车符。假设文件中的每一行都以 ascii 10 和 13 结尾。

【讨论】:

  • 我在行首加了^。
  • 这是我一直使用的。我不知道为什么这个解决方案没有得到支持。它在 v6 之前绝对有效
【解决方案4】:

我找到了解决方法。 简单地说,在扩展模式下,将所有 \r\n 替换为文档其余部分中不存在的字符串,例如。 ,,,newline,,,(注意特殊的正则表达式字符,如 $&*)。 然后切换到正则表达式模式,做一些替换(现在换行符是,,,newline,,,)。 接下来,再次切换到扩展模式,将所有,,,newline,,, 替换为\r\n

【讨论】:

  • 这适用于小文档。在一个非常大的文件(> 1M 行)上进行了尝试。 Notepad++完全挂掉了(可能是内存太少了)。使用这种方法的问题是:替换所有换行符时,您的整个文档在一行上结束。
  • 处理大型文档的潜在修改是关闭文档,并使用 Kuchara 的实用解决方法,使用带有目录和文件名过滤器的替换文件,该过滤器只会修改预期的文件。因此,在单行上进行转换时,无需在 Scintilla 编辑器中打开文件。
【解决方案5】:

对于 Notepad 6 及更高版本,将其作为正则表达式执行:

  • 选择搜索模式 > 正则表达式(不带 . 匹配换行符)
  • 在查找内容文本框中:a[\r\n]b[\r\n]+c[\r\n]

或者,如果您正在查看(Windows 或 Unix)文件以将其换行符视为 \r\n\n,那么您可能会发现使用扩展模式更容易:

  • 选择搜索模式 > 扩展(\n、\r、\t、\0、\x...)
  • 在 Windows 的 Find what 文本框中:a\r\nb\r\nc\r\n
  • 或者在 Unix 的 Find what 文本框中:a\nb\nc\n

不清楚 OP 的意图是否也是选择尾随行返回(在“c”之后),因为这是删除行所必需的。

要不选择尾随换行符,以替换为非空字符串,只需从匹配语句中删除最后的换行符即可。

请注意,如果字符串的最后一行应该有匹配项,而没有匹配的尾随行返回,则匹配失败。

【讨论】:

    【解决方案6】:

    a\r\nb\r\nc 适合我,但不适用于 ^a\x0D\x0Ab\x0D\x0Ac

    嗯,可惜换行符不适用于正则表达式。现在我必须再次回到 Textpad。 :(

    【讨论】:

      【解决方案7】:

      选择搜索模式 扩展(\n、\r、\t、\0、\x...)

      \n 是新行等 This is Manuel

      【讨论】:

        【解决方案8】:

        Find: "(^a.$)\r\n(b.)\r\n^(c.*)$" - 拾取 3 整行,只存储数据

        替换为:“\1\2\3” - 放下(重放)数据

        在正则表达式中使用 Notepad++ v7.9.5 可以正常工作

        占位符:^ 开始和 $ 行尾可以如图所示在 () 存储内部或外部,但在给定示例中显然不是必需的。注意“[^x]”是不同的——这里“^”是“NOT”。

        存储和重放的优势允许进行更复杂的模式匹配,而无需再次输入您想要结束的内容,甚至可以更改重放:“bca”为“\2\3\1”

        【讨论】:

          【解决方案9】:

          在 Notepad++ 中,您也可以尝试突出显示文本的所需部分,然后按 CTRL+J。

          这将证明文本的合理性,从而删除所有行尾。

          【讨论】:

          • 这与问题有什么关系?
          猜你喜欢
          • 1970-01-01
          • 2013-03-19
          • 1970-01-01
          • 2015-08-08
          • 1970-01-01
          • 1970-01-01
          • 2018-11-17
          相关资源
          最近更新 更多