这里我想在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??
答案 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
。在您的示例中,可能只有一个B
或P
。如果您希望匹配多个B
和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();
}