想要为双面排除文件编写镜头。示例:
+ /etc
- /
所以我的镜头是这样的:
module DuplyExclude =
let nl = del /[n]+/ "n"
let entry = [ label "entry" . [ label "op" . store /(+|-)/ ] . del /[ t]+/ " " . [ label "path" . store //[^ tnr]+/ ] ]
let lns = ( entry . nl )*
test lns get "+ /hellon+ /etcn- /" = ?
这会导致一个错误。我从一些实验中知道,正则表达式/(+|-)/
与第二行不匹配。问题是:为什么破折号看起来不可匹配,即使被逃脱了?
这有两个原因:
- 测试字符串缺少一个尾随的
n
。这一点很重要,因为lns
被定义为一个条目后面跟着一个无条件的新行。请注意,这只会真正影响使用augpresse的字符串测试,因为当通过库加载文件时,它会为读取的任何文件添加一个尾部(因为许多镜头无法处理丢失的EOL) - 路径节点被定义为匹配单个
/
,然后是store //[^ tnr]+/
中的至少一个(+
)其他字符。这与单个/
条目不匹配
因此,有了这两个变化,这个镜头就可以工作了:
模块DuplyExclude=设nl=del/[\n]+/"\n"let entry=[label"entry".[label"op".store/(\+|-)/]。del/[\t]+/"。[label"path".store/\/[^\t\n\r]*/]]设lns=(entry.nl)*测试lns是否获得"+/hello\n+/etc\n-/\n"=?
测试结果:/tmp/duplyexclude.aug:6.2-.44:{"条目"{"op"="+"}{"path"="/hello"}}{"条目"{"op"="+"}{"path"="/etc/"}}{"条目"{"op"="-"}{"path"="/"}}