如何仅为多个搜索结果的第一次出现添加书签?

如何仅为多个搜索结果的第一次出现添加书签?

我对正则表达式还很陌生,非常希望得到一些指导。
我有一个相当大的文本文件,我想为关键字的行添加书签,但只为它们的第一个实例。

例如:


苹果很好吃。
我喜欢乌龟。
他很高。
她很漂亮。
去死吧!
乌龟很聪明。
这些是世界上最美丽的建筑。
苹果对你的健康有好处。
匈牙利国旗是红、白、绿三色横旗。
乌龟是爬行动物。
你很聪明。
匈牙利语是一门很难学的语言。
香蕉和苹果通常很便宜。


如果我创建一个正则表达式 (apple|turtle|hungarian),我会得到 8 行书签,但在上面提到的例子中,我只需要第一次出现的内容,所以我只想为以下句子添加书签:

  • 苹果很好吃。
  • 我喜欢乌龟。
  • 匈牙利国旗是红、白、绿三色水平旗。

有没有办法做到这一点?

先感谢您。

答案1

好问题,我不得不去学习一些新的正则表达式技巧才能找到答案 :)
我认为没有办法只用一个正则表达式语句同时解决所有单词的问题。我的解决方案是按单词逐个解决。对于 100 个关键字... 这仍然是可以管理的。

以下是

\A^.*?(?<!apple).*?\Kapple

让我来分解一下...

我们正在寻找苹果的第一次出现

apple

但是前面没有苹果这个词,所以我们需要使用负向后视功能

(?<!apple)apple

但是,中间可能会有其他字符和换行符,因此,选择选项“。匹配换行符”并使用:

(?<!apple).*?apple

.* 需要非贪婪,我不完全确定为什么......:)

新的,因为这个问题(我不得不去问才能弄清楚;)),我们需要将正则表达式锚定到文件的开头:

\A^(?<!apple).*?apple

\A 是“字符串的永久开始",在 notepad++ 中它与文件的开头匹配。
我们还必须添加 ^, 将其锚定到文件的第一行。

当然,文件开头和第一次出现 apple 之间可能会有字符,因此

\A^.*?(?<!apple).*?apple

而且,我们只对苹果的位置感兴趣,而不是整个模式,所以我们使用 \K 来将目前匹配的文本排除在整体正则表达式匹配之外

\A^.*?(?<!apple).*?\Kapple

相关内容