如何在Notepad++中复制已标记的文本

71

我有一个包含字符串的HTML源文件部分,我想使用Notepad++的正则表达式功能一次性选择并复制它们。

这是文本源的一部分:

<option value="Performance"
>Performance</option>
<option value="Maintenance"
>Maintenance</option>
<option value="System Stability"
>System Stability</option>

我正在使用正则表达式"[0-9a-zA-Z ]*"来搜索"value"值。我还在Notepad++搜索中选择了突出显示/标记已找到的文本功能。这很好用,现在我想将仅突出显示的文本复制或剪切到剪贴板以进行进一步处理。但是我无法在Notepad++中找到此功能。这是否不可能或者我太傻了?


我不熟悉notepad++,但Ctrl-C不起作用吗(就像在Windows的其他地方一样),还是你正在寻找可脚本化的方法,或者说你需要什么? - James Curran
Ctrl-C无法复制字符串。看起来Notepad++有两种不同的方式来标记和突出显示缓冲区中的文本。通过正则表达式匹配的文本会以某种颜色突出显示,例如用鼠标标记的文本会以灰色突出显示。这段文本可以使用Ctrl-C复制。但是你不能同时标记文本的不同部分。 - Alex
Ankit在superuser上的回答是使用Notepad++来完成导出所有正则表达式匹配项的方法。 - Fidel
10个回答

105
自 Notepad++ 5.9 起,新添加了“删除未标记行”功能,可用于清除不需要的内容并对每个值行的其他文本进行某些搜索和替换。
步骤如下:
  1. 使用搜索-->查找-->标记功能标记要保留/复制的每一行文本,并记得在标记文本之前勾选“书签行”
  2. 选择搜索-->书签-->删除未标记行
  3. 使用搜索-->查找-->替换将其他不需要保留/复制的文本替换为空
  4. 保存剩余的文本或复制它。
你还可以使用搜索-->书签-->复制书签行来实现类似的操作。
因此,在技术上你仍然无法复制标记的文本,但是你可以给带有标记文本的行添加书签,然后对带书签或不带书签的行进行各种操作。

+1 - 很棒的小技巧,当在大型日志文件中查找特定条目时非常方便。 - CraigTP
谢谢。我按照这个指南提取了标记行。然后阅读了一条说明,该说明在 https://notepad-plus-plus.org/community/topic/10839/copy-regular-expression-search-results-to-clipboard/5 链接中提取仅匹配的文本。 搜索 .?(\d+ +\w+). 替换为 \1 - Nguyễn Văn Vinh

26

我为了完整性而添加这个内容,因为这篇文章在谷歌搜索结果中排名很高。

实际上,你可以从正则表达式搜索中复制所有内容,只是不能一步到位。

  1. 在搜索框内输入正则表达式,在“查找内容”下使用“标记”。
  2. 选择“标记行”并单击“全部标记”。
  3. 单击“搜索”->“书签”->“复制标记行”。
  4. 粘贴到新文档中。
  5. 你可能需要使用搜索和替换来删除一些不属于正则表达式部分的不需要的文本。

2
这个列表中的第5项对我来说是耗时的部分。由于Notepad++显然不支持复制标记的文本,所以我转而使用另一款免费软件:Ultrapico的Expresso。我将整个文本粘贴到Expresso的“示例文本”窗格中,并将我在Notepad++中准备好的相同正则表达式搜索粘贴到“正则表达式”窗格中。然后我点击“运行匹配”,右键单击“搜索结果窗格”/“将匹配的文本复制到剪贴板”。 - Andreas Jansson

20

可以尝试这个方法:

首先,解决行尾问题: (Notepad++不允许多行正则表达式)

[扩展模式]搜索: \r\n> (或者你自己系统的行尾)

替换为: >

然后

[正则表达式模式]搜索: <option[^>]+value="([^"]+)"[^>]*>.*

(如果要匹配所有value而不仅仅是选项,只需删除前面的option即可)

替换为: \1

第二个正则表达式的说明:

<option[^>]+     Find a < followed by "option" followed by 
                 at least one character which is not a >

value="          Find the string value="

([^"]+)          Find one or more characters which are not a " and save them
                 to group \1

"[^>]*>.*        Find a " followed by zero or more non-'>' characters
                 followed by a > followed by zero or more characters.

是的,它使用正则表达式解析HTML -- 这些警告很重要 -- 一定要仔细检查输出。


+1 我也正想发表类似的内容。好答案。 - Beanish
这可能是正确的方向。但是组\1只包含第一个值,即“Performance”。其余部分未存储在该组中。 - Alex
Alex,你确定吗...我在Notepad++中使用你的数据尝试了一下,每个值都单独占据一行。 - Sean Vieira
你说得对。它起作用了。我在第一步中去掉了所有的换行符。因此只匹配一个线条的文本,它只给出了一个结果。非常感谢。 - Alex

20

这与https://superuser.com/questions/477628/export-all-regular-expression-matches-in-textpad-or-notepad-as-a-list类似。

我希望您正在尝试提取:
"性能"
"维护"
"系统稳定性"

以下是方法 - 第1/3步:打开搜索 -> 查找 -> 替换选项卡,选择正则表达式单选按钮。在“查找内容”中输入:(\"[a-zA-Z0-9\s]+\"),在“替换为”中输入:\n\1,然后单击“全部替换”按钮。 Before Clicking Replace All

第2/3步:完成第一步后,您的关键字将出现在下一行(如下图所示)。现在转到标记选项卡,在“查找内容”中输入相同的正则表达式字段。 勾选书签行。然后点击“全部标记”。 Bookmark the lines

第3/3步:转到“搜索” -> “书签” ->“删除未标记行”。Remove Unmarked lines

因此,您将得到以下最终结果。Final Result


这在多行正则表达式中不起作用。只有第一行被“加书签”,而后面的行只是“标记”。如何保留“标记”行? - Al G Johnston

12

在Notepad++中增加这样一个功能会非常好。我使用以下技术从文件中提取所有匹配项:

powershell
select-string -Path input.txt -Pattern "[0-9a-zA-Z ]*" -AllMatches | % { $_.Matches } | select-object Value > output.txt

如果您只想要排序后的不同匹配项:

powershell
select-string -Path input.txt -Pattern "[0-9a-zA-Z ]" -AllMatches | % { $_.Matches } | select-object Value -unique | sort-object Value > output.txt

1
完全胡说八道,你是救命恩人。 - dbinott
1
太棒了!比Notepad ++的解决方案好多了。 - blindstuff
我们应该如何使用这个?我们应该把这段代码放在哪里?如果您能多解释一点,谢谢。 - Happy Bird
我该如何使其能够搜索字符串并选择该行及其上面两行,找到所有这些三行集,并将它们导出?目前在notepad++中使用(?m)(^[^\r\n]*\R+){2}STRING[^\r\n]*\R+(^[^\r\n]*\R+){0},但我必须去查找、剪切、粘贴、重复。 - droopie

12

「复制标记文本」现在是Notepad ++内置函数 - 图解答案

我安装的Notepad++版本已经有几年了,并且我已经关闭了自动更新。在将Notepad++更新到最新版本(8.1.1)后,我发现现在支持复制标记文本!

尽管上面有评论试图解释同样的事情,但我想自己回答并附上图片:

enter image description here

获得相同结果的更冗长的方法是“标记全部”,然后转到“搜索”菜单。然后选择“复制带样式文本/查找样式(已标记)”。


太棒了!谢谢 Andreas。 - Fidel

4
Notepad++ v7.9.3 中,他们提供了一个选项来复制标记的文本。进入搜索菜单,选择标记选项(Ctrl+M),输入你想要查找的内容,然后点击标记所有选项,再点击复制标记的文本,并将其粘贴到任何你想要的地方。
你可以在搜索模式下使用正则表达式选项来复制多个标记行
一个简单的例子:假设你正在寻找任何一行上的字面字符串12345
首先,匹配该特定行的所有内容以及其行结束字符,只需使用正则表达式:^.*12345.*\R 其次,若要选择: 该行所有的内容和接下来的10行,使用正则表达式:^.*12345.*\R(.*\R){10} 该行所有的内容和前面的10行,使用正则表达式:(.*\R){10}^.*12345.*\R 该行所有的内容以及此行前后5行的内容,请使用正则表达式:(.*\R){5}^.*12345.*\R(.*\R){5} 注意:对于第三个例子,还有另一种使用到组1的子程序调用的语法,(?1),如下所示:(.*\R){5}^.*12345.*\R(?1){5}

如果只是像“点击标记所有选项,然后点击复制标记的文本并粘贴到任何您想要的地方”这样简单就好了。我没有看到任何“复制标记的文本”选项。请解释一下如何操作。 - LilGames
1
你好 @LilGames,请更新 Notepad++ 至 Notepad++ v7.9.3 版本。在这个版本中,你会发现 复制标记文本 选项。 - Pyk Patel

2

不,截至Notepad++ 5.6.2版本,这似乎不可能实现。尽管可以进行列选择(Alt+Selection),但显然没有实现多重选择,因此也不受搜索功能的支持。


奇怪的是,5.6.6版本确实可以用某种颜色突出显示匹配的文本部分,但却无法将其复制到剪贴板中。 - Alex

0

我曾经遇到过同样的问题。你可以在 PSPad 编辑器中将正则表达式匹配项列在新标签页中,每个匹配项都在新行中,这与 Notepad++ 非常相似。

按 Ctrl + F 进行搜索,勾选正则表达式选项,输入正则表达式并点击“列表”按钮。


0

使用记事本不可能,但这里有一个简单的解决方案

您需要免费软件Expresso v3.1 http://www.ultrapico.com/ExpressoDownload.htm

我使用了另一款免费软件:Ultrapico的Expresso。

  1. 安装后进入“测试模式”选项卡。
  2. 将您的正则表达式复制到“正则表达式”窗格中。
  3. 将要搜索的整个文本粘贴到Expresso的“示例文本”窗格中,

  4. 点击“运行匹配”按钮。右键单击“搜索结果窗格”,然后选择“导出到...”或“将匹配的文本复制到剪贴板”。

注意:原作者是@Andreas Jansson,但它被隐藏在评论中,因此由于此页面在Google搜索中排名较高,我在此为其他人留下它。


这个答案已经不再适用了。Expresso不再需要了。今天我发现在Notepad++的后续版本中支持复制标记文本。请查看我在此主题中的最新答案。 - Andreas Jansson

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