负前瞻的正则表达式替代方案

Regex alternative to negative lookahead

我想匹配包含关键字 build 的所有路径,除非它们还包含 .html

这是一个使用负前瞻的工作正则表达式:https://regexr.com/4msck

我在 unison 中使用正则表达式进行路径匹配,它不支持负先行。我如何在没有负面前瞻的情况下复制上述正则表达式的功能?

根据手册,这应该可行。它基于评论:"I want to ignore all files in a build directory except for html files"

ignore = Regex .*build.*
ignorenot = Name {*.html}

我不熟悉 unison,所以我必须假定您可以指定超过 1 个规则的路径。

我之所以有这样的期待,是因为手册中的这句话:

There is also an ignorenot preference, which specifies a set of patterns for paths that should not be ignored, even if they match an ignore pattern.

可以,但是生成的正则表达式在可读性和可维护性方面很差。

http://regexr.com/4mst1

^(?:[^\.\n]|\.(?:$|[^h\n]|h(?:$|[^t\n]|t(?:$|[^m\n]|m(?:$|[^l\n])))))*build(?:[^\.\n]|\.(?:$|[^h\n]|h(?:$|[^t\n]|t(?:$|[^m\n]|m(?:$|[^l\n])))))*$

解释:

  • ^ - string/line
  • 的开始
  • (?:[^\.\n]|\.(?:$|[^h\n]|h(?:$|[^t\n]|t(?:$|[^m\n]|m(?:$|[^l\n])))))* - 匹配任何不包含 .html
  • 的内容
  • build - 字面意思是字符串
  • (?:[^\.\n]|\.(?:$|[^h\n]|h(?:$|[^t\n]|t(?:$|[^m\n]|m(?:$|[^l\n])))))* - 与之前相同
  • $ - string/line
  • 结束