正则表达式 - 正面观察

时间:2015-09-11 17:21:59

标签: regex notepad++ lookbehind

我有一些数百万行的文件,其中包含以下内容:

9/9/2015 2:50:39 PM: Export for https://portal.gaf.com/sites/RCNHistory/Lists/RCNs/Attachments/148/Ruberoid HW Plus SV.xls Complete.
9/9/2015 2:50:39 PM: Export for https://portal.gaf.com/sites/RCNHistory/Lists/RCNs/Attachments/148/Ruberoid Mop Granule SV.xls Complete.
9/9/2015 2:50:40 PM: Export for https://portal.gaf.com/sites/RCNHistory/Lists/RCNs/Attachments/148/Ruberoid Mop Smooth 1.5 SV.xls Complete.

我希望在每一行上捕获文件名,后面带有以下内容:

$(?<=\/)当然,我必须删除&#34;完成。&#34;但我觉得我慢慢开始

但我还没有掌握正则表达的艺术。谁能让我知道我做错了什么?

谢谢。

4 个答案:

答案 0 :(得分:1)

这可能有效 - 您将从捕获组中检索文件名:

\/([^\/]*) Complete.$

以下是regexr的示例:http://www.regexr.com/3bp2l

答案 1 :(得分:1)

如果线条全部采用此格式,则无需使用lookbehind复杂化。 你可以使用贪婪的匹配来获得你想要的东西。

.*\/(.*) Complete.

本质上是:

将所有内容(包括/ s)与/后跟一些文本(在本例中为您的文件名)匹配,后跟文字“完成”。

匹配组包含文件名。

因此,对于N ++中的正则表达式查找和替换,您应该使用:

查找

.*\/(.*) Complete.

替换

$1

这将为您留下每行的文件名。

答案 2 :(得分:0)

Lookbehind是一个位置的零宽度断言。这不是告诉正则表达式从哪里开始的方式 - 它必须始终从头开始。您可以使用像.*/(.*) Complete这样的正则表达式捕获它。

如果你正在使用shell,那么cut工具也很适合。

# get everything after the last slash and before the last space (` Complete`)
rev $INPUT_FILE | cut -d'/' -f 1 | cut -d' ' -f2- | rev

答案 3 :(得分:0)

您可以将此正则表达式与lookbehind一起使用:

/(?<=\/)[^\/]+$/

请务必使用MULTILINE模式。

RegEx Demo