我对正则表达式还很陌生,非常希望得到一些指导。
我有一个相当大的文本文件,我想为关键字的行添加书签,但只为它们的第一个实例。
例如:
苹果很好吃。
我喜欢乌龟。
他很高。
她很漂亮。
去死吧!
乌龟很聪明。
这些是世界上最美丽的建筑。
苹果对你的健康有好处。
匈牙利国旗是红、白、绿三色横旗。
乌龟是爬行动物。
你很聪明。
匈牙利语是一门很难学的语言。
香蕉和苹果通常很便宜。
如果我创建一个正则表达式 (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