【发布时间】:2013-03-29 01:59:46
【问题描述】:
我可以使用this regex:
^(?!^(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:?"||/?
如果我遗漏了一些明显的东西,我提前道歉,并感谢您提供的任何帮助。
【问题讨论】:
-
我想我可以使用更简单的方法,直到找到正确的倒置规则。像这样的东西现在似乎适合我的需求:stackoverflow.com/questions/3885964/… 但是,如果有人有正确的“倒置”正则表达式,我会成为接受者。再次感谢。
-
我可能误解了这个问题。您是在尝试单独选择每个无效字符,还是在无效时尝试选择整个文件名?我的回答解决了后者。
-
首先,感谢您对此进行调查。我刚刚看了你的建议,似乎我误会了自己。也许我应该编辑我最初的问题,但我想用有效的东西替换模式检测为无效的任何字符(或字符组)(因此,匹配它),留下有效字符(或字符组)作为他们是(不匹配)。希望这消除了混乱。在我上面的例子中,预期的匹配应该是:COM1:?"||/?
-
我明白了,我会编辑我的答案。但请注意,您的答案中的预期值不正确。根据第一个正则表达式,
COM1仅当它是整个文件名时才无效。所以预期的匹配应该是:?"||/?。 -
你是对的。我想我的测试并没有我最初想象的那么彻底。
标签: regex vbscript regex-negation