在java中使用regex验证文件名

时间:2013-02-04 18:27:05

标签: java regex

这里我想在java中使用regex验证文件名。我实现了下面的代码,但这对我来说不适用于第三类文件。

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

我的验证文件名看起来像这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 个答案:

答案 0 :(得分:2)

您的regexBetaPilot错了:您正在逃离[BP]课程的开头括号。试试这个:

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

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

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

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

编辑我在+之后离开[BP],因为这就是原始代码中的内容。但是,如果要匹配单个 B或P,则应从模式中删除+

答案 1 :(得分:0)

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

这有效:

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

答案 2 :(得分:0)

这样的事情应该适用于AB是静态的:

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

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

这会错过你列出的两个残疾人,但我不确定为什么他们应该无效。如果你更好地解释成功/失败的规则,我可以更多地发言吗?

答案 3 :(得分:0)

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

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

匹配AB_digits.digits。然后是可选的.digits.B.digits.P.digits。最后匹配.fuij。在您的示例中,可能只有一个BP。如果您希望匹配多个BP,只需再次添加+

然后您的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();
}
相关问题