在java中使用regex验证文件名

在java中使用regex验证文件名,java,regex,Java,Regex,这里我想用java中的正则表达式验证文件名。我实现了下面的代码,但这不适用于我的第三类文件 我可以检查正则表达式中的前缀和扩展名吗 我的验证文件名如下所示 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.

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

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

我的验证文件名如下所示

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
代码:

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

您的
regexBetaPilot
错误:您正在脱离
[BP]
类的开头括号。请尝试以下方法:

String regexBetaPilot = "^\\d+\\.\\d+\\.[BP]+\\.\\d+$";
您可以轻松地将所有三种模式组合为一种模式:

String regex = "\\d+\\.(\\d+\\.([BP]+\\.)?)?\\d+";
您不需要锚定(
^
$
)。由于您使用的是
matches()
而不是
find()
,因此它将始终尝试匹配整个字符串


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

您正在转义

[BP]
的左括号,因此它尝试在字符串中查找
[

这项工作:

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

在AB是静态的情况下,类似这样的东西应该可以工作:

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

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


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

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

AB_\d+\.\d+(?:(?:\.[BP])?\.\d+)?\.fuij
这将匹配
AB\u digits.digits
。然后是可选的
.digits
.B.digits
.p.digits
。最后匹配
.fuij
。从您的示例中,可能只有一个
B
p
。如果您希望匹配多个
B
p
,只需添加
e> +
再次

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

您应该删除我们理解和回答问题所不需要的所有不必要的代码。类似“这是我的输入字符串,这是我的
regex
,这是我期望的”就足够了。为什么要显式删除前缀和后缀?这可以在regex中轻松完成,如果需要的话e字符串值您可以通过捕获来实现这一点。既然如此,为什么要使用三个单独的正则表达式字符串?您可以在一个正则表达式中捕获所有带有前缀和后缀的三种形式。我想我会首先快速尝试使用一个正则表达式来处理前缀和后缀以及所有三种形式。我承认我没有测试过这一点,但我认为至少是c丢失。[^\]+\\\d+\.\\d+\.([^.]+\\\\d+\.[^.]+\[BP]\.\\d+\.[^.]+)@迈克:谢谢你的回答,但是我怎样才能用正则表达式添加前缀和后缀呢?你能帮我解决这个问题吗?谢谢你的回答,在这里我可以用正则表达式本身添加后缀和前缀吗?以及你在正则表达式strin中做了什么,其中3个正则表达式是组合在一起的?你能在这里解释我关于()还有?符号的意思?请,thanks@Sam_k-要匹配文本值,只需按字面将它们添加到正则表达式中。例如,正则表达式可以是
“AB\\\ud+\.(\\d+\.([BP]+\.?)?\\d+\.fuij”。构造`简单地说就是将模式
X
作为一个单独的匹配组进行匹配。构造
X?
意味着
X
可以出现0次或1次(与
X{0,1}
相同)。总之,
(X)
意味着括号内的模式是可选的。(它与
X?
大致相同,只是它允许
X
多个项目。)请参阅。非常感谢您的回复感谢您的友好回复?您所写的
能更好地解释成功/失败的规则吗?
的意思是?AB总是存在吗?为什么
AB_0.1.fuij
失败和
AB_1.1.fuij
在您的例子中成功?Matthew,O从来都不是版本的代表,0的含义是什么我只是从你上面的列表中抽出来。
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();
}