0

正規表現を使用して特定のフォルダー名を検証しようとしています。いくつかのテストを試してみましたが、正常に動作します。完全に安全かどうか、または正規表現に何かが欠けているかどうかをお知らせください。

 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

有効なディレクトリ名はシステムに依存し、場合によっては実際のファイルシステムにも依存するため、一部のシステムでは確かに間違っています。リモートでマウントされたファイルシステムは通常、ファイルシステムホストの規則に従う必要があります。ローカルシステム。

これに直面して、あなたが解決したい実際の問題に応じて、2つの解決策があります。最も簡単な方法は、ファイルを作成して、返されたエラーを確認することです。これにより、名前が現在の環境で有効かどうかをすばやく簡単に確認できます。ただし、後でどこでも読み取ることができる階層を作成する必要がある場合は、非常に控えめなアプローチを取り、英数字と、'_'場合によっては小文字と数字のみを許可することをお勧めします(誤って作成するリスクを回避するため)。大文字と小文字のみが異なる2つのディレクトリ)。長さを制限することもできます。(これまで、6文字しか使用できないシステムがありましたが、今日では少し過剰に聞こえます。)

禁止されている名前に関して:これもシステムに大きく依存し、ディレクトリが作成されている場所に依存する可能性があります。(Unixには予約済みの名前はありませんが、特定のディレクトリで特定の名前を使用しようとすると、ほぼ確実に問題が発生します。"local"一般的には問題ありませんが、で作成しようとはしません"/usr/"。)

于 2012-10-29T13:56:23.850 に答える