Notepad++正则表达式中的换行符

47

假设你有这个文件:

x
a
b
c
x
x
a
b
c
x
x

如果你想在Notepad++中查找序列abc (并选择整个三行),该如何在正则表达式中表示换行符?


请务必按照此线程中提到的要求打开匹配换行符选项。 - aljipa
2
@aljipa 那个选项并不必要,当需要在特定位置换行时。 - ANeves
10个回答

59
Notepad++可以轻松完成这个任务,甚至不需要使用正则表达式。在查找对话框中,看一下左下角并切换搜索模式到扩展模式,它允许匹配\n等字符。由于你很可能正在处理一个Windows格式的文件,所以你应该寻找\r\n(回车符和换行符)。
a\r\nb\r\nc

将在三行中查找模式


4
哦,好的。我试过a、b、c...忘了换行。谢谢! - theSpyCry
1
有时需要使用正则表达式搜索换行符(如果您想进行更复杂的搜索,包括换行符)。但正如下一个答案中所详细说明的那样,这是不可能的。 - NeDark
1
请注意,我曾经尝试在Notepad++ 5.9.3中使用“正则表达式”(而不是“扩展”)来使换行符起作用,但徒劳无功!但在Notepad++ 6.0中可以正常工作-请参见darioo的答案。 - SharpC
1
我认为这不正确,问题要求使用正则表达式,而不是扩展模式。在正则表达式中,\x0D表示换行符,\x0A表示回车符。请参考答案https://dev59.com/3G855IYBdhLWcg3wViy3#4398728。 - ClearBlueSky85

35

2012年6月18日更新:

通过新版的Notepad++ v6,你可以使用正则表达式搜索换行符。所以你只需使用以下内容:

a\r\nb\r\nc

即使使用正则表达式也可以实现你想要的功能。注意,\r\n 是 Windows 换行符的编码形式,在 Unix 文件中是 \n

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

你可以使用扩展搜索进行换行符搜索,但我不认为这有助于你搜索 3 行内容。

更多信息请参见 这里

更新:Robb 和 StartClass0830 关于扩展搜索的说法是正确的。它确实可以工作,但在使用正则表达式搜索时不行。


1
我认为这个答案是错误的。请查看 Robb 和我的答案以核实这个答案是否正确。 - TechTravelThink
@StartClass0830: 我尝试了你和Robb的答案,但是我无法让多行匹配起作用。编辑:是的,在使用扩展搜索时它确实有效。但是在使用正则表达式时不起作用。你是对的。 - darioo
1
假设该行以 \r \n 结尾。也许在您的环境中,文件的行仅以 \n 结尾(没有 \r)。 - TechTravelThink
无论如何,有没有比Notepad++更好的支持完整正则表达式的工具? - theSpyCry
1
@PaN1C_Showt1Me:嗯,总有Vim和Emacs。我都用过,它们都有非常强大的正则表达式支持。但是学习曲线总是让人望而却步。我建议你访问http://www.vim.org/,下载Vim并在尝试进行任何严肃的操作之前先完成教程。 - darioo
这让我节省了时间。我尝试着将正则表达式与换行符混合使用。 - Deep

14
^a\x0D\x0Ab\x0D\x0Ac

这将起作用\x0D表示换行,\x0A表示回车。假设您的文件中每行都以ASCII 10和13结尾。


我在行首添加 ^ 符号。 - TechTravelThink
1
这是我一直使用的。我不知道为什么这个解决方案没有得到赞同。在v6之前,它绝对有效。 - crush
我喜欢这个解决方案,因为它允许正则表达式和换行符的组合,这正是我正在寻找的 - 仅使用正则表达式搜索\n是不可行的。 - hello_earth

5
我找到了一个解决办法。 在扩展模式下,将所有的\r\n替换成文档中不存在的字符串,例如,,,newline,,,(注意特殊的正则表达式字符如$&*)。 然后切换到正则表达式模式,进行一些替换操作(现在换行符是,,,newline,,,)。 接下来,再次切换到扩展模式,并将所有的,,,newline,,,替换成\r\n

这在小文档上运行良好。尝试在一个非常大的文件(>1M行)上使用它。Notepad++完全挂起(可能是由于内存过少)。这种方法的问题是:当替换所有换行符时,整个文档都会出现在一行上。 - Dave
处理大型文档的一个潜在修改方法是关闭文档,并使用Kuchara的实用解决方案,使用带有目录和文件名过滤器的“替换文件”功能来仅修改预期的文件。因此,在对单行进行转换时无需在Scintilla编辑器中打开文件。 - JMD

1

我在处理Windows CR/LF格式的文档时遇到了一个小问题。

如果你勾选了匹配换行符的选项,你需要使用“..”来匹配CR/LF。所以如果你有:

<blah><blah>",
"<more><blah>

你需要使用",.."来匹配一些带逗号、回车或换行符的字符串和另一个字符串。


1

对于Notepad 6及以上版本,请按照以下正则表达式操作:

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

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

  • 选择搜索模式> 扩展(\n,\r,\t,\0,\x ...)
  • 在Windows的“查找内容”文本框中输入:a\r\nb\r\nc\r\n
  • 或者在Unix的“查找内容”文本框中输入:a\nb\nc\n

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

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

请注意,如果字符串的最后一行有匹配项,但没有匹配的尾行回车,则匹配失败。

0

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

\n 表示换行等 这是 Manuel


如果你的搜索字符串依赖于正则表达式,那么这是无用的。 - undefined

0

查找: "(^a.$)\r\n(b.)\r\n^(c.*)$" - 挑选3行完整的数据,仅存储数据

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

在Notepad++ v7.9.5中的正则表达式中运行良好

占位符: ^ 行首和 $ 行尾可以在()内或外使用,如示例所示,但在给定示例中明显不必要。注意 "[^x]" 是不同的 - 这里 "^" 表示 "非"。

存储和重放的优点是允许更复杂的模式匹配,而无需再次输入想要得到的内容,甚至可以更改重放方式: "\2\3\1" 代表 "bca"


0

a\r\nb\r\nc 对我来说可以工作,但是 ^a\x0D\x0Ab\x0D\x0Ac 不行。

唉,太糟糕了,换行符与正则表达式不兼容。现在我又得回到 Textpad 了。:(


-4
在Notepad++中,您也可以尝试突出显示所需文本的部分,然后按CTRL+J键。
这将使文本对齐,从而删除所有行结尾。

2
这与问题有什么关系? - cheesemacfly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接