-1

鉴于以下 3 个代表服务器路径的示例路径,我试图通过 PCRE 正则表达式为我的 FTP 客户端创建一个跳过列表,但似乎无法获得预期的结果。

/subdir-level-1/subdir-level-2/.../Author1_-_Title1-(1234)-Publisher1
/subdir-level-1/subdir-level-2/.../Author2_-_Title2_(5678)-PUBLiSHER2
/subdir-level-1/subdir-level-2/.../Author3_-_Title3-4951-publisher3

我想跳过所有不以结尾的文件夹(不是路径)

-Publisher1

我试图在这个在线帮助和这个正则表达式测试器的帮助下创建一个工作模式,但是除了这个负前瞻模式之外别无他法

.*-(?!Publisher1)

但是对于此模式,所有行都匹配,因为对于所有这些行,直到该模式的子字符串都不包含该模式。

/subdir/subdir/.../Author1_-_Title1-(1234)  -Publisher1
/subdir/subdir/.../Author2_-_Title2_(5678)  -PUBLiSHER2
/subdir/subdir/.../Author3_-_Title3-4951    -publisher3

我的错误是什么?正确的模式如何仅匹配第二行和第三行作为要跳过的行但保留第一行?

编辑以使其更清楚要突出显示的内容和不突出的内容。

从路径开头到最后一个斜杠的所有内容都必须被忽略(允许)。必须跳过与定义的正则表达式匹配的最后一个斜杠之后的所有内容。

看截图

编辑以呈现仅匹配红色部分的高级模式

[^/]*(?<!-Publisher2)$

正则表达式可视化

调试演示

4

4 回答 4

3

您使用的正则表达式是:

.*-(?!Publisher1)

我会告诉你它有什么问题。

根据这个正则表达式,它将匹配那些没有-后跟的行Publisher1。好的,你注意到你的-文字中间有没有,是的。在作者和标题之间或在标题之后。所以所有的字符串都满足这个条件。相反,如果您以否定前瞻的方式进行搜索,使得 hiphen 与 Publisher1 一起使用,那么您的匹配应该可以工作。

因此,您计划在括号内移动 hiphen 以使其匹配并使您的正则表达式如下所示:

^.*(?!-Publisher1)

但这也行不通,因为这里 .* 匹配所有内容,所以当我们进行前瞻时,我们无法找到要匹配的单个字符。因此,我们将使用否定的lookbehind。<.

.*(?<!-Publisher1)

现在怎么办 ?. 我已经做了所有事情,但我仍然无法让它发挥作用。为什么会这样?

因为否定的lookbehind会回溯并判断它是否没有跟随-Publisher1

这很复杂,请耐心等待:

假设你的字符串

/subdir/subdir/.../Author1_-_Title1-(1234)-Publisher1

我们对-Publisher1. 从 1 之后的位置。即当我们回顾时,字符串的末尾-Publisher1是可见的。但是我们的情况是负面的。因此,它将向左移动一个字符,使其无法再回首并说“嘿,我可以从这里看到 -Publisher1”,因为从这里我们只能看到“-Pub​​lisher”。我们的条件满足,但正则表达式仍然匹配字符串的其余部分。

因此,必须将lookbehind 绑定到字符串的末尾,这样它就不会向左移动一个字符来搜索其匹配项。

最终正则表达式:

.*(?<!-Publisher1)$

在这里演示:http ://regex101.com/r/lE1vW2

于 2014-04-09T16:26:40.097 回答
1

您可以使用以下正则表达式来排除包含 Publisher1 的行:

^((?!Publisher1).)*$

在线演示:http ://regex101.com/r/gD8jK0

于 2014-04-09T16:07:36.953 回答
1

这应该适合您的需求:

^.*(?<!-Publisher1)$

正则表达式可视化

调试演示

于 2014-04-09T16:00:09.810 回答
1

我想跳过所有不以结尾的文件夹-Publisher1

您可以使用这个基于负前瞻的正则表达式:

^(?!.*?-Publisher1$).+$

工作演示

于 2014-04-09T16:01:31.977 回答