如何处理正则表达式中的波浪号/摆动破折号 (~) 以排除临时 MS Office 文件?

How to handle a tilde / swung dash (~) in a regular expression in order to exclude temporary MS Office files?

我在 xml 中有一个由作业调度引擎调度的批处理作业。该引擎提供了观察目录内容变化的可能性。我的任务是监控 文件交换服务器 运行 Windows 上的目录,客户和客户上传我们需要的文件处理。

我们需要尽快了解新文件的到来。

为了不匹配子目录和临时文件,我必须将正则表达式放入 xml-job。

在大多数情况下,客户和客户上传格式为 text/csv/pdf 的文件,这不会造成任何问题。有些上传 MS Office 文件,另一方面,如果有人在目录中打开它们,就会成为问题。然后创建一个以 ~$.

开头的不可见临时文件

根据调度引擎​​的文档,正则表达式遵循POSIX1003.2标准。但是,当有人打开受监控目录中的 MS Office 文件时,我无法阻止发送通知。

到目前为止我尝试过的正则表达式是:

先尝试,然后再注意临时办公室文件:

^[a-zA-Z0-9_\-]+\.+[a-zA-Z0-9_\-][^~][^.part]*$

第二次尝试,意图是排除前导~:

^[^~][a-zA-Z0-9_\-]+\.+[a-zA-Z0-9_\-][^~][^.part]*$

第三次尝试,意图是通过其字符代码排除前导 ~

^[^\x7e][a-zA-Z0-9_\-]+\.+[a-zA-Z0-9_\-][^~][^.part]*$

第四次尝试,目的是通过大写 E:

的字符代码排除前导 ~

^[^\x7E][a-zA-Z0-9_\-]+\.+[a-zA-Z0-9_\-][^~][^.part]*$

所有这些都不会停止在文件打开时发送通知……

有人知道该怎么办吗? 欢迎所有建议和替代方案。

我什至在 regex101, regexplanet.com, regexr.com and regextester.com 检查了它们,第二次尝试完全符合要求。我什至没有忘记配置 POSIX 编译,如果在这些站点(不是全部)上可能的话。

How can I exclude the ~ character from matching the regular expression (at the beginning of a file name)?

短版:

How can I create a regular expression that matches any file with any extension apart from .part and does neither match the file thumbs.db, nor any file whose name begins with a ~?

Requirements: What should not be matched:

Subfolders (my approach was files without a .),

Thumbs.db (Windows thumbnails db),

*.part (filezilla partial uploads),

~$. (temporary files starting with ~ or ~$, MS Office tmp files)

以下列表提供了一些必须通过正则表达式匹配或不匹配的文件和文件夹:

尝试查找正则表达式时出现新问题

创建这个问题后,当我尝试应用@Bohemian 给出的答案中所述的实际正确的正则表达式时出现了一些问题。我不知道这些问题,所以为了完整性我只是将它们添加到这里。

第一个发生在 xml 中不允许使用正则表达式中的某些字符。 xml 文件被 java class 解析,抛出异常试图解析 <>,它们是 forbidden[= xml 文档中的 135=] 如果不直接与 xml 节点相关(有效:<xml-node>...</xml-node>, invalid: attribute="<ome_on, why isn't this VALI|>")。

This can be avoided by using the html names &lt; instead of < and &gt; instead of >.

第二个(目前未解决的)问题是一个操作数因实际正确的正则表达式而受到批评 ^(?=.*\.)(?!thumbs.db$)[^~].*(?&lt;!\.part)$。引擎说:

Error: 2018-08-17T06:05:46Z REGEX-13

[repetition-operator operand invalid, ^(?=.*\.)(?!thumbs.db$)[^~].*(?&lt;!\.part)$]

xml 文件中的相应行如下所示:

<start_when_directory_changed directory="F:\someDirectory" regex="^(?=.*\.)(?!thumbs.db$)[^~].*(?&lt;!\.part)$" />

现在我又卡住了,因为我对正则表达式的了解很低。它太低了,我什至不知道正则表达式中被批评的操作数是什么字符。

研究将我带到 this question,其接受的答案是“POSIX 正则表达式不支持使用问号 ? 作为星号和加号量词的非贪婪(惰性)修饰符(...)”,这让我明白了这个伟大的正则表达式有什么问题。不过,我无法提供有效的正则表达式,还需要进行更多研究……

POSIX ERE 不允许使用简单的方法从匹配中排除特定字符串。您可以禁止特定的 字符 - 就像在 [^.part] 中一样,您正在匹配一个不是(换行符或)点或 p 或 [=13= 的字符] 或 rt - 您可以指定交替,但将这些组合成排除某些特定模式的表达式非常麻烦。

这是如何做到的,但如您所见,它的可读性不是很好。

^([^~t.]|t($|[^h])|th($|[^u])|thu($|[^m])|thum($|[^b])|thumb($|[^s])|thumbs($|[^.])|thumbs\.($|[^d])|thumbs\.d($|[^b])|\.($|[^p])|\.p($|[^a])|\.pa($|[^r])|\.par($|[^t]))+$

...它仍然可能无法完全按照您的要求进行。

试试这个:

^(?=.*\.)(?!thumbs.db$)[^~].*(?<!\.part)$

参见live demo

正则表达式中的 tilda 字符没有什么特别之处。

我来晚了,但上面的评论对我很有帮助。它可能不适合你,但我的解决方案是:

file_list <- file_list[!grepl("~", file_list)]