-3

重複の可能性:
ファイル名がワイルドカードパターンと一致するかどうかを確認するにはどうすればよいですか

私が行っているプログラムでは、ユーザーには2つの入力があります。

入力1=ファイル名。
入力2=flagFilePattern

元。1
入力1=file1.xmlまたはfile25.xmlまたはfile_123.xml
入力2=file * .xml
結果(すべてのファイルはパターンに基づいて一致する必要があります(入力2)

元。2
入力1=file1.xml.done
入力2=file * .xml
結果(ファイル名の最後に.xmlが見つからなかったため、ファイルはパターンに基づいて一致しないはずです)。

質問、上記の例に基づく私の正規表現はどうあるべきですか?
注:私のコードはC#です

4

3 に答える 3

1

の値はinput 2、有効な正規表現にすることができます。あなたがする必要があるのは、^$アンカーを追加することだけです。これらにより、正規表現エンジンがそのパターンに明確に一致できるようになるため、あなたの場合、次のようにすることができます:

 String input2 = "file*.xml";
        Regex regex = new Regex("^" + input2.Replace(".", "\\.").Replace("*",".*") + "$");
        String input1 = "file_123.xml";
        String input3 = "file_123.xml.done";

        System.Console.WriteLine(regex.IsMatch(input1));
        System.Console.WriteLine(regex.IsMatch(input3));
        System.Console.ReadLine();
...

.正規表現の特殊文字であるため、エスケープする必要があります。2 番目のreplaceステートメントは、以上の繰り返しを意味する演算子.の前に、任意の文字を意味するa を追加します。*上記のコードは、それぞれ と を生成TrueFalseます。

編集:上記のように、シナリオによっては、より多くの文字をエスケープする必要があります。

編集 2: 以下のコードは、正規表現言語の一部である文字列をエスケープする必要があります。あなたの場合、これは*オペレーターも意味します。私はRegex.Escapeメソッドを使用して、特別な正規表現の意味を持つ可能性のあるすべての文字をエスケープし、通常の方法を使用しreplace*元に戻しました。

            String input2 = "file*.xml";
            input2 = Regex.Escape(input2);  //Yields file\\*\\.xml
            input2 = input2.Replace("\\*", ".*");  //Yields file.*\\.xml
            Regex regex = new Regex("^" + input2 + "$");
            String input1 = "file_123.xml";
            String input3 = "file_123.xml.done";

            System.Console.WriteLine(regex.IsMatch(input1));
            System.Console.WriteLine(regex.IsMatch(input3));
            System.Console.ReadLine();
于 2012-09-17T06:35:56.600 に答える
1

input2 を使用して、それを次のような正しいパターンに変換するだけです

var regex = new Regex(@"\A" + (args[1].Replace(".", @"\.").Replace("*", ".*")) + @"\Z");
于 2012-09-17T06:35:59.307 に答える
-1

が常に有効な正規表現である場合input 2は、次のコードを使用できます。

String regex = input2;

Pattern pattern = Pattern.compile(regex); 

Matcher matcher = pattern.matcher(input1); 
于 2012-09-17T06:33:58.773 に答える