使用Java正则表达式在字符串中间查找匹配字符串
我需要验证文件输入,以确保其具有正确的版本控制。例如,这是输入文件:使用Java正则表达式在字符串中间查找匹配字符串,java,regex,string,Java,Regex,String,我需要验证文件输入,以确保其具有正确的版本控制。例如,这是输入文件:W:\\folder\\test\u v2301\u 01\u 29\u 2014\u 1420.pfd 我已经在Java中构建了一个正则表达式来查找我正在寻找的用于验证文件的版本控制字符串 RegEx:v[0-9]{4}{u0-9]{2}{u0-9]{2}{u0-9]{4}{u0-9]{4}但是,它失败了,因为RegEx正在查看文件的开头 调用:if(!arcvalFileFormBean.getTxtFileReview()
W:\\folder\\test\u v2301\u 01\u 29\u 2014\u 1420.pfd
我已经在Java中构建了一个正则表达式来查找我正在寻找的用于验证文件的版本控制字符串
RegEx:v[0-9]{4}{u0-9]{2}{u0-9]{2}{u0-9]{4}{u0-9]{4}
但是,它失败了,因为RegEx正在查看文件的开头
调用:if(!arcvalFileFormBean.getTxtFileReview().matches(“v[0-9]{4}{[0-9]{2}}{0-9]{2}{[0-9]{4}”)
在不知道字符串距开头有多远的情况下搜索字符串的最佳方法是什么?尝试以下方法:
if (!arcvalFileFormBean.getTxtFileReview().matches(
".*?v[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4}_[0-9]{4}.*"))
String#matches
尝试匹配完整的输入,因此在您的版本regex之前*?
,之后的*
将确保此模式在输入中的任何地方都匹配。而不是向regex添加前导和尾随匹配所有参数,您还可以先编译模式,创建一个匹配器实例,然后在返回的匹配器上调用find()
Pattern pattern = Pattern.compile("v[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4}_[0-9]{4}");
Matcher matcher = pattern.matcher(arcvalFileFormBean.getTxtFileReview());
if (!matcher.find()) {
...
}
Matcher还提供了一个matches()
操作,尽管它的行为类似于字符串中的Matcher函数,因为它仅在整个字符串与RegEx模式匹配时返回true
模式/匹配器构造可用于发现某个子字符串是否与模式匹配,如果匹配,则替换该字符串的某些部分。也就是说,我们使用这种方法是为了使用定制的LogbackCompositeConverter
来屏蔽日志语句中的某些密码,该Logback包含如下所示的类似逻辑:
Pattern urlAuthPattern = Pattern.compile("//(.*?):.*?@");
Matcher matcher = urlAuthPattern.matcher("ftp://user1:userPW@localhost:21/path/to/somewhere");
if (matcher.find()) {
// should return ftp://user1:XXX@localhost:21/path/to/somewhere
return matcher.replaceAll("//$1:XXX@");
}
工作得很有魅力。非常感谢。如果可能的话,我会在9分钟内把答案标记为“是”。