如何在 Mercurial 中忽略除 node_modules 内的所有 bin 文件夹?

How to ignore all bin folders except ones inside node_modules in Mercurial?

我试图忽略解决方案中的所有 * /bin/*,node_modules 文件夹中的文件夹除外。所以:

/something/file.txt <- not ignored 
/something/bin/file.txt <- ignored
/something/node_modules/anything/bin/file.txt <-not ignored

glob patter 无法处理该问题,因此我正在尝试提出正确的正则表达式。

我想到了:

.*?\/bin\/(?<!node_modules).*

但还是有不对的地方。 我想匹配任何包含 /bin/ 的字符串,但如果 /bin/

之前的某处有 node_modules 则不匹配

您需要在正则表达式

的开头放置您的负面回顾 (?<!..)

negative lookbehind : 确保给定的模式不会匹配并在表达式中的当前位置结束。不消耗字符。

/(?<!not )foo/

这不匹配:not foo

这场比赛:but foo

尝试这样的事情:

(?<!node_modules).*?(?<!node_modules)\/bin\/(?<!node_modules).*

如果您使用自己的逻辑,很可能您无法在此处使用所需的无限宽度后视。

我建议在开始时使用前瞻:

^(?!.*\/node_modules(?=\/).*\/bin\/).*\/bin\/.*
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  

先行检查是否有除换行符以外的 0+ 个字符,直到最后一个 /node_modules 后跟 \,然后再检查除换行符之外的 0+ 个字符换行尽可能多到最后一个 /bin/(注意:最后一个 \/ 可以替换为 (?:$|\/) 以检查字符串末尾的 /)。如果在 /bin/.

之前有 /node_modules/,则此前瞻基本上无法匹配

.*\/bin\/.* 匹配包含 /bin/.

的行

regex demo