Windows中文件名或文件夹名称中不允许的符号为\ / : * ? " < > |
。我为它写了一个正则表达式,但是不能写正则表达式来排除“(双引号)。
Regex regex = new Regex(@"^[\\\/\:\*\?\'\<\>\|]+$");
尝试如下,但它没有用:
Regex regex = new Regex(@"^[\\\/\:\*\?\'\<\>\|"]+$");
编辑: 我特别在寻找具有正则表达式的代码,因此它不是重复的。
非常感谢帮助。感谢。
答案 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(...)
,因为这个正则表达式应该是静态的并且预先编译好了)