0

想为重复排除文件写一个镜头。例子:

+ /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- /" = ?

这会导致错误。我从实验中知道,正则表达式/(\+|-)/与第二行不匹配。问题是:为什么破折号似乎无法匹配,即使被\?

4

1 回答 1

1

有两个原因:

  1. 测试字符串缺少尾随\n. 这很重要,因为lns它被定义为有一个条目后跟一个无条件的新行。请注意,这只会真正影响使用 augparse 的字符串测试,因为当通过库加载文件时,它会在读入的任何文件中添加尾随 \n(因为许多镜头无法处理丢失的 EOL)。
  2. 路径节点被定义为匹配单个/后跟至少一个 ( +) 中的其他字符store /\/[^ \t\n\r]+/。这不会匹配单个/条目。

所以有了这两个变化,这个镜头就起作用了:

模块 DuplyExclude =
  让 nl = del /[\n]+/ "\n"
  让条目= [标签“条目”。[标签“操作”。存储 /(\+|-)/ ] 。德尔 /[ \t]+/ " " 。[标签“路径”。存储 /\/[^ \t\n\r]*/ ] ]
  让 lns = ( entry . nl )*

  测试 lns 得到 "+ /hello\n+ /etc\n- /\n" = ?
测试结果:/tmp/duplyexclude.aug:6.2-.44:
  { “入口”
    {“操作”=“+”}
    {“路径”=“/你好”}
  }
  { “入口”
    {“操作”=“+”}
    {“路径”=“/等”}
  }
  { “入口”
    {“操作”=“-”}
    {“路径”=“/”}
  }
于 2015-12-10T11:12:31.230 回答