0

我正在尝试使用正则表达式验证给定的文件夹名称,我尝试了一些测试并且效果很好,如果我完全安全或者我的 reg 表达式遗漏了什么,请告诉我:

 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 )

先感谢您。

4

2 回答 2

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.          
于 2012-10-29T13:52:00.530 回答
0

对于某些系统来说这肯定是错误的,因为有效的目录名称取决于系统,甚至可能取决于实际的文件系统:远程安装的文件系统通常必须遵守文件系统主机的约定,而不是本地系统。

面对这种情况,有两种解决方案,具体看你要解决的实际问题。最简单的一种就是尝试创建文件,并检查返回的错误。这将使您快速轻松地检查名称在当前环境中是否合法。但是,如果您需要创建以后可以在任何地方读取的层次结构,最好的解决方案是采用非常保守的方法,只允许字母数字字符和一个'_',甚至可能只允许小写和数字(以避免意外创建的任何风险两个目录,其名称只是大小写不同)。您可能还想限制长度。(从历史上看,有些系统只允许六个字符,但今天听起来有点过分了。)

关于禁止名称:这也非常依赖于系统,并且可能取决于创建目录的位置。(在 Unix 下没有保留名称,但如果您尝试在特定目录中使用某些名称,几乎肯定会遇到麻烦:"local"一般来说没问题,但我不会尝试在 . 下创建它"/usr/"。)

于 2012-10-29T13:56:23.850 回答