只能在字符串中的特定位置找到一个匹配项

时间:2016-07-21 01:19:45

标签: regex notepad++

我正在尝试处理大型构建日志,以查找错误位置的复制操作。我只是使用Notepad ++。

如果我有这样的字符串:

  

第25672行:创建硬链接以将C:\ DevDir \ DERP \ Output \ x64 \ Release \ someBin.dll复制到C:\ DevDir \ not \ good \ path \ here \ someBin.dll

和这个

  

第25673行:创建硬链接以将C:\ DevDir \ not \ good \ path \ here \ someBin.dll复制到C:\ DevDir \ DERP \ Output \ x64 \ Release \ someBin.dll

这里的特殊字是DERP来寻找。基本上,我需要查看DERP中的某些内容何时被复制到非DERP位置,以及非DERP位置何时复制到DERP位置。

所以我需要找到:

  

\scopy\s,然后是DERP,然后是\sto\s,然后是DERP到行尾

     

\scopy\s,然后是DERP,然后\sto\s,然后是DERP到行尾

我尝试了几种变体来让第一个工作。我认为在交换负向前瞻时我有第二个工作,但在手动滚动聚合结果后,我看到DERPto的错误一侧得到^.*? copy .*?DERP.*? to (?!DERP).*$

DERP

我无法使用仅由to的频率决定的答案,因为相对路径可能会导致DERP的一方拥有多个(^.*? copy )(?>(?:(?!DERP).)*? to).*?DERP.*?$ s。这个相对路径子句是我遇到麻烦的地方。

编辑:

嗯...做了一些修补,这看起来很有希望:

window.location.href=

2 个答案:

答案 0 :(得分:2)

好的,找到DERP然后找不到DERP:

(^.*? copy ).*?DERP.*? to (?>(?:(?!DERP).)*?$)

找不到DERP,然后找到DERP:

(^.*? copy )(?>(?:(?!DERP).)*? to).*?DERP.*?$

所以我猜这里的答案是使用这种类型的嵌套:

(?>(?:(?!ThingToNotFind).))*?SomethingToFind

如果有更优雅的方式来编写或表达这一点,我会接受这个答案。虽然我可以使用和修改它,但我很难看到这些嵌套模式并对它们进行修改。

答案 1 :(得分:2)

也许您还应该使用DERP周围的路径分隔符来确保您真正查看完整的文件夹名称。

解决方案I

这是在编辑问题所假设的正则表达式之后:

((^.*? copy )(?>(?:(?!DERP).)*? to).*?DERP.*?$|(^.*? copy ).*?(DERP).*? to (?>(?:(?!DERP).)*$))

查看游乐场:https://regex101.com/r/hX9aR4/1

解决方案II

NOTEPAD ++支持捕获组。因此,我会用它来进行所有错误的复制。

查找:(?:^(?:(?!\\DERP\\).)*$)|(?:^.* copy .*?(?:\\DERP\\).* to .*(?:\\DERP\\).*$)|(^.* copy .*\\DERP\\.*$)|(?:^.*$)

替换:\1

Explanatoin

(?:^(?:(?!\\DERP\\).)*$)这匹配不包含“\ DERP \”的行,但不捕获它们。

(?:^.* copy .*?(?:\\DERP\\).* to .*(?:\\DERP\\).*$)匹配从DERP到另一个DERP的coppy的每个日志,但不捕获它。

然后(^.* copy .*\\DERP\\.*$) 与一个或多个DERP文件夹匹配并捕获行,但由于我们已经摆脱了第一个表达式中包含两个或更多个行的那些行,因此我们应该是安全的。< / p>

然后(?:^.*$)匹配具有非捕获表达式的所有其他行,因此它们将被替换为任何内容,就像第一个非捕获部分一样。

查看游乐场:https://regex101.com/r/nJ9iC4/3