想为双重排除文件编写镜头。例如:
+ /etc
- /
所以我的镜头看起来像这样:
module DuplyExclude =
let nl = del /[\n]+/ "\n"
let entry = [ label "entry" . [ label "op" . store /(\+|-)/ ] . del /[ \t]+/ " " . [ label "path" . store /\/[^ \t\n\r]+/ ] ]
let lns = ( entry . nl )*
test lns get "+ /hello\n+ /etc\n- /" = ?
这会导致错误。我从实验中得知,正则表达式/(\+|-)/
与第二行不匹配。问题是:为什么破折号似乎不匹配,即使被\
转义?
答案 0 :(得分:1)
这有两个原因:
\n
。这很重要,因为lns
被定义为具有条目后跟无条件的新行。请注意,这只会影响使用augparse的字符串测试,因为当通过库加载文件时,它会向读入的任何文件添加尾随\ n(因为许多镜头无法处理丢失的EOL)。/
中的单个+
,后跟至少一个(store /\/[^ \t\n\r]+/
)其他字符。这与单个/
条目不匹配。所以有了这两个变化,这个镜头就可以了:
module DuplyExclude = let nl = del /[\n]+/ "\n" let entry = [ label "entry" . [ label "op" . store /(\+|-)/ ] . del /[ \t]+/ " " . [ label "path" . store /\/[^ \t\n\r]*/ ] ] let lns = ( entry . nl )* test lns get "+ /hello\n+ /etc\n- /\n" = ?
Test result: /tmp/duplyexclude.aug:6.2-.44: { "entry" { "op" = "+" } { "path" = "/hello" } } { "entry" { "op" = "+" } { "path" = "/etc" } } { "entry" { "op" = "-" } { "path" = "/" } }