3

我是正则表达式的新手(尽管我已经成功使用过很多次)。我想查找文档中所有不以“.html”结尾的链接我想出的正则表达式是:

href=\"([^"]*)(?<!html)\"

在我的编辑器 Notepad++ 中,href=\"([^"]*)\"找到所有链接(以“html”结尾的链接和不以“html”结尾的链接)。为什么消极的lookbehind不起作用?

我也尝试过前瞻:

href=\"[^"]*(?!html\")

但这也没有用。

有人可以帮忙吗?

干杯,卑躬屈膝

4

5 回答 5

8

如果您使用 PERL 或 PCRE(例如 PHP 中的 preg_match),则该正则表达式可以正常工作。但是,大多数不支持前瞻和后瞻断言,尤其是更简单的正则表达式引擎,例如 Notepad++ 使用的引擎。几乎所有的正则表达式引擎只支持最基本的语法,例如量词、子模式和字符类。

您可以在以下位置找到 notepad++ 正则表达式引擎的文档:http: //sourceforge.net/apps/mediawiki/notepad-plus/index.php ?title=Regular_Expressions

于 2010-03-25T11:19:44.263 回答
1

编辑:Notepad++ 使用 SciTE 正则表达式引擎,它不支持环视表达式。

欲了解更多信息,请查看这里http://www.scintilla.org/SciTERegEx.html


原始答案

^.*(?<!\.html)$

于 2010-03-25T11:12:06.247 回答
1

您可以制作一个正则表达式来完成它,但它可能太复杂了:

href=\"((([^"]*)([^h"][^"][^"][^"]|[^t"][^"][^"]|[^m"][^"]|[^l]))|([^"]|)([^"]|)([^"]|))\"
于 2010-03-25T12:08:25.537 回答
0

非常感谢大家。

最后正则表达式确实不起作用。

我只是使用了一种解决方法,并将所有链接替换为它们自己+“.html”,然后将所有出现的“.html.html”替换为“.html”。

所以我替换href=\"([^"]*)\"href="\1.html",然后.html.html替换为.html

无论如何,谢谢,卑躬屈膝

于 2010-03-25T13:12:40.620 回答
0

请注意,Notepad++(现在?)支持这样的断言。(我有 Notepad++ 6.3,日期为 2012 年 2 月 3 日。)

我相信正则表达式文档意味着两个替换变体都使用相同的 PCRE 方言:

  • 标准:(Search | Replace默认快捷方式Ctrl H
  • 插件:(TextFX | TextFX Quick | Find/Replace默认快捷方式Ctrl R
于 2013-03-28T16:04:05.300 回答