Java正则表达式验证

4

我想在Java中验证一个字符串,该字符串只允许包含字母数字字符、一个点字符和一个下划线字符。

String fileName = (String) request.getParameter("read");

我需要验证从请求中获取的文件名,并满足上述条件

我尝试了"^[a-zA-Z0-9_'.']*$",但这允许多个点字符

我需要在给定场景下验证我的字符串,

1. 文件名只包含字母数字值。 2. 它只允许一个点字符(.),例如:fileRead.pdf,fileWrite.txt等 3. 它只允许下划线字符。所有其他符号都应该被拒绝

可以有人帮我吗?


2
你能分享一个输入输出的例子吗? - Youcef LAIDANI
这个在线服务 https://regex101.com/ 让你可以尝试正则表达式,并解释了正则表达式中的单个字符及其作用,非常适合自学 :) - Herr Derb
你应该指出文件名是否包含文件扩展名。你的模式允许最后一个点和第一个点。 - mattn
你应该意识到,无论是Windows还是Unix/Linux/OSX都允许文件名中有多个点字符。你的特殊限制有具体目的吗? - Klitos Kyriacou
3个回答

17

您应该使用String.matches()方法:

System.out.println("My_File_Name.txt".matches("\\w+\\.\\w+"));

你也可以使用 java.util.regex 包。

java.util.regex.Pattern pattern = 
java.util.regex.Pattern.compile("\\w+\\.\\w+");

java.util.regex.Matcher matcher = pattern.matcher("My_File_Name.txt");

System.out.println(matcher.matches());

了解有关REGEX 和 JAVA的更多信息,请查看此页面: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html


1
不要使用 matcher.find(),而是使用 matcher.matches()。你的答案中的正则表达式部分接受像 ßαd.txt(或更糟糕的:.........a.txt)这样的输入。如果你使用 matches(),那么就不会再出现这种情况了。 - Olivier Grégoire
你必须转义反斜杠双倍。 - mattn
谢谢你,Olivier。 - Valentin Genevrais
谢谢你,mattn :) - Valentin Genevrais

1
您可以在此处使用两个负向先行断言:

^((?!.*\..*\.)(?!.*_.*_)[A-Za-z0-9_.])*$

每个前瞻断言都断言点号或下划线不会出现两次,这意味着它最多只能出现一次。
不完全清楚您是否需要一个点号和/或下划线。我假设不需要,但我的正则表达式可以轻松修改以符合此要求。

演示


0
你可以先检查具有数量限制的特殊字符。 以下是代码:
int occurance = StringUtils.countOccurrencesOf("123123..32131.3", ".");

或者

int count = StringUtils.countMatches("123123..32131.3", ".");

如果不符合您的要求,您可以在正则表达式检查之前将其丢弃。 如果没有问题,您现在可以将您的字符串放入字母数字值检查中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接