我需要验证文件输入以确保它具有正确的版本控制。例如,这是输入文件:W:\\folder\\test_v2301_01_29_2014_1420.pfd
我在 Java 中构建了一个正则表达式来查找我正在寻找的版本控制字符串来验证文件。
正则表达式: v[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4 }_[0-9]{4}
但是,它失败了,因为正则表达式正在查找文件的开头。
调用: if (!arcvalFileFormBean.getTxtFileReview().matches("v[0-9]{4}_[0-9]{2}_[0-9 ]{2}_[0-9]{4}_[0-9]{4}"))
在不知道距离开始有多远的情况下搜索字符串的最佳方法是什么?
最佳答案
您也可以先编译模式,创建匹配器实例,然后在返回的匹配器上调用 find()
,而不是向 RegEx 添加前导和尾随匹配所有参数。
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()
操作,尽管它的行为类似于 String 中的 matcher 函数,因为它仅在整个字符串与 RegEx 模式匹配的情况下返回 true。
Pattern/Matcher 构造可用于发现某个子字符串是否与该模式匹配,如果匹配则替换该字符串的某些部分。 IE。我们使用这种方法来使用自定义的 Logback CompositeConverter
来掩盖日志语句中的某些密码,它包含如下所示的类似逻辑:
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@");
}
关于java - 使用 Java 正则表达式在字符串中间查找匹配的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21442078/