我正在尝试使用正则表达式来验证给定的文件夹名称,我尝试了一些测试并且它工作正常,如果我完全安全或我的表达错过了某些内容,请告诉我:
QRegExp regExp("^( [a-zA-Z] )( ( [a-zA-Z_\-\s0-9\.\)\(] )( [^\\!@#$%^&/:*?<>""|]* ) )*$" );
QStringList ForbidenNameU;
ForbidenNameU<<"CON"<<"PRN"<<"AUX"<<"NUL"<<"COM"<<"COM1"<<"COM2"<<"COM3"<<"COM4"<<"COM5"<<"COM6"<<"COM7"<<"COM8"<<"COM9"<<"LPT"<<"LPT1"<<"LPT2"<<"LPT3"<<"LPT4"<<"LPT5"<<"LPT6"<<"LPT7"<<"LPT8"<<"LPT9";
QStringList ForbidenName;
ForbidenName<<"con"<<"prn"<<"aux"<<"nul"<<"com"<<"com1"<<"com2"<<"com3"<<"com4"<<"com5"<<"com6"<<"com7"<<"com8"<<"com9"<<"lpt"<<"lpt1"<<"lpt2"<<"lpt3"<<"lpt4"<<"lpt5"<<"lpt6"<<"lpt7"<<"lpt8"<<"lpt9";
if((Dirname->text().contains(regExp))&& !ForbidenNameU.contains(Dirname->text())&& !ForbidenName.contains(Dirname->text()))
{
validname=true;
qDebug()<<"match in dir name = "<<regExp.cap(0);
emit completeChanged();
}...
PS(我不想使用GetInvalidFileNameChars()
或任何其他api)
提前谢谢。
答案 0 :(得分:4)
在Windows环境中:
^(?!(?:CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(?:\.[^.]*)?$)[^<>:"/\\|?*\x00-\x1F]*[^<>:"/\\|?*\x00-\x1F\ .]$
使用CASE_INSENSITIVE和UNICODE_CASE修饰符。
^ # Anchor to start of string.
(?! # Assert filename is not: CON, PRN,
(?: # AUX, NUL, COM1, COM2, COM3, COM4,
CON|PRN|AUX|NUL| # COM5, COM6, COM7, COM8, COM9,
COM[1-9]|LPT[1-9] # LPT1, LPT2, LPT3, LPT4, LPT5,
) # LPT6, LPT7, LPT8, and LPT9...
(?:\.[^.]*)? # followed by optional extension
$ # and end of string.
) # End negative lookahead assertion.
[^<>:"/\\|?*\x00-\x1F]* # Zero or more valid filename chars.
[^<>:"/\\|?*\x00-\x1F\ .] # Last char is not a space or dot.
$ # Anchor to end of string.
答案 1 :(得分:0)
对于某些系统来说肯定是错误的,因为什么是有效的目录名称 将取决于系统,甚至可能是实际的文件系统: 远程安装的文件系统通常必须遵守 文件系统主机的约定,而不是本地系统的约定。
面对这种情况,有两种解决方案,具体取决于实际情况
你想解决的问题。最简单的就是尝试创造
该文件,并检查返回的错误。这将给你一个快速和
在当前环境中轻松检查名称是否合法。如果你
需要创建一个层次结构,以后可以在任何地方读取,但是,
最好的解决方案是采取非常保守的方法,只允许
字母数字字符和'_'
,甚至可能只是小写字母
和数字(以避免意外创建两个目录的风险
其名称仅在案例中有所不同)。您可能还想限制
长度。 (历史上,有一些系统只允许六个
人物,但今天听起来有点过分。)
关于禁止的名字:这也是系统依赖的,
并且可能取决于创建目录的位置。 (那里
在Unix下没有保留的名字,但你几乎肯定会去
如果您尝试使用特定的某些名称,则会遇到麻烦
目录:"local"
一般都很好,但我不会尝试创建
它在"/usr/"
下。)