鉴于以下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
我正试图在this online help and和this regex tester的帮助下创建一个工作模式,但除了这种负面的前瞻模式之外,我还没有进一步发展
.*-(?!Publisher1)
但是使用这种模式所有行都匹配,因为所有行都匹配到模式的子串都不包含模式。
/subdir/subdir/.../Author1_-_Title1-(1234) -Publisher1
/subdir/subdir/.../Author2_-_Title2_(5678) -PUBLiSHER2
/subdir/subdir/.../Author3_-_Title3-4951 -publisher3
我的错误是什么?正确的模式如何仅将第二行和第三行匹配为要跳过的行但是保留第一行?
编辑,以便更清楚地突出显示什么,以及什么不是。
必须忽略(允许)从路径开头到最后一个斜杠的所有内容。 必须跳过与定义的正则表达式匹配的最后一个斜杠之后的所有内容。
see screenshot http://i59.tinypic.com/23jg8xj.jpg
编辑以显示仅匹配红色部分的高级模式
[^/]*(?<!-Publisher2)$
答案 0 :(得分:3)
您使用的正则表达式是:
.*-(?!Publisher1)
我会告诉你它的错误。
根据此正则表达式,它将匹配那些没有-
后跟Publisher1
的行。好的,你注意到你的文本之间有-
,是的。作者和标题之间或标题之后。所以所有的字符串都满足这个条件。相反,如果你用一个负面的前瞻搜索,那么hiphen与Publisher1一起使用,那么你的匹配就可以了。
所以你计划在括号内移动hiphen,使它匹配并使你的正则表达式如下:
^.*(?!-Publisher1)
但这也行不通,因为这里。*匹配所有内容,所以当我们做一个预测时,我们无法找到匹配的单个字符。因此,我们将使用负面的观察。 <
。
.*(?<!-Publisher1)
现在怎么样? 。我已经完成了所有工作,但仍然无法让它工作。为什么会这样?
因为负面的后视会回顾并判断它是否后跟-Publisher1
。
这很复杂,只跟我说:
假设你的字符串
/subdir/subdir/.../Author1_-_Title1-(1234)-Publisher1
我们为-Publisher1
做了负面的后视。从1后的帖子。当我们回顾时,在字符串-Publisher1
的末尾是可见的。但我们的情况是消极的看法。所以它会移动一个角色到达一个不再能够回顾并且说“嘿我能看到-Publisher1 from here”的位置,因为从这里我们只能看到“-Publisher”。我们的condtin满足,但正则表达式仍然匹配字符串的其余部分。
因此必须将lookbehind绑定到字符串的末尾,这样它就不会向左移动一个字符来搜索其匹配。
最终正则表达式:
.*(?<!-Publisher1)$
答案 1 :(得分:1)
答案 2 :(得分:1)
答案 3 :(得分:1)