2

我可以使用这个正则表达式

^(?!^(PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d|\..*)(\..+)?$)[^\x00-\x1f\\?*:\"";|/]+$

在 VBscript 中检测无效的 Windows 文件名,并在保存前拒绝它们。我想通过用标准字符(例如下划线“_”)自动替换任何无效字符(或其连续字符)来为我的用户添加额外的服务。

因此,我需要想出另一种模式,因为据我所知,VBscript 仅提供一种在模式匹配时替换的方法:

with getRGX()
    .ignoreCase = TRUE
    .global = TRUE
    .pattern = < inputPattern >
    < outputCleanfileName > = .Replace( < inputDirtyFileName >, < "_" > )
end with

到目前为止,我想出的最好的方法如下:

((PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d|\..*)(\..+)?)?[\\?*:\"";|/]+

不幸的是,它与扩展名混淆了:

INPUT    = COM1:aAZB?":a|a|a/.txt?
MATCH    = COM1:?"||/.txt?
EXPECTED = COM1:?"||/?

如果我遗漏了一些明显的东西,我提前道歉,并感谢您提供的任何帮助。

4

1 回答 1

1

我认为这个正则表达式可以满足您的要求:

(?:^(PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d|\..*)(?:\.(?=.)|$)|(?:([\x00-\x1f\\?*:\"";|/])))

您可以在Debuggex上看到它是如何工作的。这个想法是“反转”拒绝正则表达式的每个部分。

于 2013-03-28T17:33:03.063 回答