负前瞻的正则表达式替代方案
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.
可以,但是生成的正则表达式在可读性和可维护性方面很差。
^(?:[^\.\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 结束
我想匹配包含关键字 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.
可以,但是生成的正则表达式在可读性和可维护性方面很差。
^(?:[^\.\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 结束