0

ここでは、Java で正規表現を使用してファイル名を検証したいと考えています。以下のコードを実装しましたが、これは 3 番目のタイプのファイルでは機能しません。

正規表現で接頭辞と拡張子を確認できますか???

私の検証ファイル名は、これらの3つの方法のようになります

1) prefix_digit.digit.extenstion         example : AB_1.1.fuij (Here fuij is my extension)
2) prefix_digit.digit.digit.extenstion   example : AB_1.1.1.fuij
3) prefix_digit.digit.B/P.digit.extensionexample : AB_1.1.B.1.fuij 

この 3 種類のファイルのみが有効です。3 つ目は、ベータ版とパイロット版のファイルです。ベータ版とパイロット版のファイルがある場合は、上記のようにする必要があります

有効なファイルと無効なファイルをいくつか書きます

**Valid :** 
    AB_1.1.fuij
    AB_1.4.fuij
    AB_1.1.1.fuij
    AB_1.1.B.1.fuij
    AB_3.4.P.7.fuij

***Invalid :***
    AB_0.1.fuij
    AB_1.B.1.1.fuij(B/P should be place on 3rd always)
    AB_1.2.B.0.fuij

コード :

import java.util.ArrayList;
import java.util.regex.Pattern;

public class democlass {
    /**
     * Test harness.
     */
    public static void main(String[] args) {
        ArrayList<String> demoversion = new ArrayList<String>();


        System.out.println("Result >>>>>>>>>>>>  "
                +isFileValid("AB_1.1.fuij"));
        System.out.println("Result >>>>>>>>>>>>  "
                +isFileValid("AB_1.B.fuij"));
        System.out.println("Result >>>>>>>>>>>>  "
                +isFileValid("AB_1.1.1.fuij"));
        System.out.println("Result >>>>>>>>>>>>  "
                +isFileValid("AB_1.P.1.1.fuij"));
        System.out.println("Result >>>>>>>>>>>>  "
                +isFileValid("AB_1.1.B.1.fuij"));

    }

    private static boolean isFileValid(String input)
    {
        String regexFinalBugFix = "^\\d+\\.\\d+\\.\\d+$"; 
        String regexFinal = "^\\d+\\.\\d+$"; 
        String regexBetaPilot = "^\\d+\\.\\d+\\.\\[BP]+\\.\\d+$"; 
        final Pattern pattern1 = Pattern.compile(regexFinal);
        final Pattern pattern2 = Pattern.compile(regexBetaPilot);
        final Pattern pattern3 = Pattern.compile(regexFinalBugFix);

        String inputVersion = null;

        int suffixIndex = input.lastIndexOf(".");
        int prefixIndex = input.lastIndexOf("_");
        if (suffixIndex > 0 && prefixIndex > 0) {
            inputVersion = input.substring(prefixIndex + 1,
                    suffixIndex);
            String prefixString1 = input.substring(0, 3);
            String suffixString1 = input.substring(suffixIndex);
            if(prefixString1.equals("AB_") && suffixString1.equals(".fuij"))
            {
                if (pattern1.matcher(inputVersion).matches()
                        || pattern2.matcher(inputVersion).matches()
                        || pattern3.matcher(inputVersion).matches()) {
                    return true;
                }
                return false;
            }
            return false;
        }
        return false;
    }
}

出力:

Result >>>>>>>>>>>>  true
Result >>>>>>>>>>>>  false
Result >>>>>>>>>>>>  true
Result >>>>>>>>>>>>  false
Result >>>>>>>>>>>>  false : It should be valid but it is false, why??
4

4 に答える 4

2

あなたregexBetaPilotは間違っています:[BP]クラスの開始ブラケットをエスケープしています。代わりにこれを試してください:

String regexBetaPilot = "^\\d+\\.\\d+\\.[BP]+\\.\\d+$";

3 つのパターンすべてを 1 つのパターンに簡単に組み合わせることができます。

String regex = "\\d+\\.(\\d+\\.([BP]+\\.)?)?\\d+";

^アンカー (および)は必要ありません$matches()の代わりに使用しているためfind()、常に文字列全体と一致しようとします。

編集+私は後に残しました[BP]。それはあなたが元のコードに持っていたものだからです。ただし、単一のB または Pに一致させたい場合+は、パターンから を削除する必要があります。

于 2013-02-04T18:39:29.037 に答える
0

正規表現を次のように簡略化できます

AB_\d+\.\d+(?:(?:\.[BP])?\.\d+)?\.fuij

これは一致しAB_digits.digitsます。次に、オプションの.digits.B.digitsまたはが続きます.P.digits。そして最後に一致し.fuijます。あなたの例から、単一のBまたはのみが存在する可能性がありますPB複数の とを一致させたい場合はP、再度追加+します。

そして、あなたのisFileValid()機能は

private static boolean isFileValid(String input)
{
    final String re = "AB_\\d+\\.\\d+(?:(?:\\.[BP])?\\.\\d+)?\\.fuij";
    final Pattern pattern = Pattern.compile(re);
    return pattern.matcher(input).matches();
}
于 2013-02-04T19:27:29.650 に答える
0

の開き括弧をエスケープしている[BP]ため、文字列内で a を見つけようとし[ます。

これは機能します:

String regexBetaPilot = "^\\d+\\.\\d+\\.[BP]+\\.\\d+$"; 
于 2013-02-04T18:39:39.590 に答える
0

このようなものは、AB が静的な場合に機能するはずです。

正規表現: AB_\d+\.\d+((\.\d){0,1}|\.[BP]\.\d+)\.fuij

Java 文字列として AB_\\d+\\.\\d+((\\.\\d){0,1}|\\.[BP]\\.\\d+)\\.fuij

これには、リストされた無効のうち 2 つがありませんが、無効にする理由がわかりませんでした。成功/失敗のルールをよりよく説明していただければ、もっとうまく説明できますか?

于 2013-02-04T18:45:51.280 に答える