【问题标题】:how to not match a pattern in xml如何不匹配xml中的模式
【发布时间】:2016-05-17 19:44:00
【问题描述】:

日志收集器采用路径来收集日志文件。如何省略 path4 目录中存在的“撤消”文件。
从下面的路径收集日志,但忽略路径4中的撤消文件

<logs>  
    <log path="/path1/path2/path3/^[undo]*"/>  
</logs>

/path1/path2/path3/path4/undo1.txt
/path1/path2/path3/path4/undo2.txt

【问题讨论】:

  • 哪个日志收集器?这很重要——XML 处理不同于纯文本处理。

标签: xml perl unix


【解决方案1】:

假设这个日志收集器采用 perl 正则表达式或类似的标签,那么它会是:

<logs>  
    <log path="/path1/path2/path3/(?!undo)[^/]*"/>  
</logs>

(根据日志收集器是否需要正则表达式匹配整个文件名,末尾的[^/]*可能不需要)

不幸的是,“日志收集器”这个名字有点笼统,所以我实际上不知道你的意思是什么软件,所以我不知道它是否确实采用了 perl 正则表达式;提供您使用的实际软件的参考会很有帮助。


好的,这是正则表达式应该匹配的内容,使用这个 perl 测试程序:

my $re = qr{/path1/path2/path3/(?!undo)[^/]*};

for (<>) {
  chomp;
  if ($_ =~ $re) {
    print "$_ matches\n"
  } else {
    print "$_ DOES NOT MATCH\n"
  }
}

这向我们展示了:

/path1/path2/path3/foo.txt matches
/path1/path2/path3/bar.log matches
/path1/path2/path3/undo_5.txt DOES NOT MATCH
/path1/path2/path3/ matches

这就是为什么我真的想要一个指向该软件的指针。因为您说修改后的正则表达式不起作用,“撤消”文件仍然被拉入,这告诉我日志软件与正则表达式的完整文件名不匹配,而只有路径(目录)名称。从上面的证据我们可以看出,正则表达式不匹配名称以“undo”开头的文件。

由于您希望目录中的某些文件匹配而有些不匹配,因此您应该希望您的软件具有类似单独的file= 属性,该属性接受文件名的正则表达式。

【讨论】:

  • 日志收集器使用 perl reg 表达式。
  • 我希望它不会,因为您正在阅读 XML,并且 XML 的正则表达式处理很讨厌。
  • 我尝试了更改,但撤消文件仍然存在。
  • path4下以undo开头的文件被匹配,每次都被收集。 path3 下的文件和目录需要记录。
  • @user3269606 该正则表达式不会匹配以 undo 开头的文件。因此,日志收集器实际上并没有使用该正则表达式匹配文件 - 它可能匹配目录吗? (因为该表达式将匹配/path1/path2/path3/)如果您更改为/path1/path2/path3/(?!undo)[^/]+ 会怎样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 2011-02-06
  • 2019-03-31
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
相关资源
最近更新 更多