正则表达式禁止窗口不允许其文件/文件夹名称中的所有符号

时间:2017-11-14 12:32:33

标签: c# regex

Windows中文件名或文件夹名称中不允许的符号为\ / : * ? " < > |。我为它写了一个正则表达式,但是不能写正则表达式来排除“(双引号)。

Regex regex = new Regex(@"^[\\\/\:\*\?\'\<\>\|]+$");

尝试如下,但它没有用:

Regex regex = new Regex(@"^[\\\/\:\*\?\'\<\>\|&quot;]+$");

编辑: 我特别在寻找具有正则表达式的代码,因此它不是重复的。

非常感谢帮助。感谢。

2 个答案:

答案 0 :(得分:4)

您可以执行以下操作,而不是使用Regex:

var invalidChars = new HashSet<char>(Path.GetInvalidFileNameChars());
var invalid = input.Any(chr => invalidChars.Contains(chr));

答案 1 :(得分:1)

使用Path.GetInvalidFileNameChars()的@Allrameest答案可能是您应该使用的答案。

我想要解决的是你的正则表达式实际上是错误的或非常无效的(我不知道你想要做什么)。

所以,使用:

var regex = new Regex(@"^[\\\/\:\*\?\'\<\>\|]+$");

表示你匹配的字符串只包含“禁用”字符(BTW,我认为单引号'无效)。这是你想要的吗?不要这么认为。你做的是:

  • ^字符串的开头
  • [...]+仅限无效字符(至少一次)
  • $字符串结尾

也许你想要@"^[^...]+$"(帽子用了两次)?

无论如何,您的问题(使用正则表达式)的解决方案是:

  • 不要使用^$只是尝试找到其中任何一个并快速轰炸
  • 在原始字符串(以@"开头的那个)中,你通过将它加倍来转义双引号。

所以,正确的正则表达式是:

var regex = new Regex(@"[\\\/\:\*\?\""\<\>\|]");
if (regex.Match(filename).Success) {
    throw new ArgumentException("Bad filename");
}

找到任何炸弹。

@JohnLBevan更新

var regex = new Regex(
    "[" + Regex.Escape(new string(Path.GetInvalidFileNameChars())) + "]");
if (regex.Match(filename).Success) {
    throw new ArgumentException("Bad filename");
}

(不使用string.Format(...),因为这个正则表达式应该是静态的并且预先编译好了)