【问题标题】:Replacing invalid characters with an underscore before save保存前用下划线替换无效字符
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 完美。我有“反转拒绝正则表达式的每个部分”的想法,但仍然错过了其中的某些部分。再次感谢你。已提供答案。
猜你喜欢
  • 2018-05-20
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 2015-04-20
  • 2021-01-11
  • 2015-03-23
  • 2016-10-13
相关资源
最近更新 更多