0

在这里,我想在 java 中使用正则表达式验证文件名。我实现了下面的代码,但这不适用于第三种类型的文件。

我可以检查正则表达式中的前缀和扩展名???

我的验证文件名看起来像这 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 种类型的文件有效。第三个是测试版和试用版文件。如果有测试版和试用版文件,那么应该是我上面提到的

我要写一些有效和无效的文件

**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+$";

您可以轻松地将所有三种模式组合成一个模式:

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

您不需要锚点(^$)。由于您使用matches()而不是find(),它总是会尝试匹配整个字符串。

编辑我后来离开了+[BP]因为那是您在原始代码中所拥有的。但是,如果要匹配单个B 或 P,则应+从模式中删除 。

于 2013-02-04T18:39:29.037 回答
0

您正在转义 的左括号[BP],因此它会尝试[在字符串中找到 a 。

这有效:

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

您可以将正则表达式简化为

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

这符合AB_digits.digits. 然后是一个可选的.digits,.B.digits.P.digits。最后匹配.fuij。从您的示例中,可能只有一个Bor P。如果要匹配多个Bs 和Ps,只需+再次添加。

然后你的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

像这样的东西应该适用于 AB 是静态的:

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

作为 Java 字符串 AB_\\d+\\.\\d+((\\.\\d){0,1}|\\.[BP]\\.\\d+)\\.fuij

这错过了您列出的两个无效,但我不确定为什么它们应该无效。如果你能更好地解释成功/失败的规则,我可以更多地了解吗?

于 2013-02-04T18:45:51.280 回答